Development Tip

두 필드 값으로 PHP 정렬 배열

yourdevel 2020. 11. 26. 19:58
반응형

두 필드 값으로 PHP 정렬 배열


나는 이와 같은 배열이 있습니다

배열 (
 [0] => Array ( "destination"=> "Sydney",
               "airlines"=> "airline_1",
               "one_way_fare"=> 100,
               "return_fare => 300
       ),
 [2] => Array ( "destination"=> "Sydney",
               "airlines"=> "airline_2",
               "one_way_fare"=> 150,
               "return_fare => 350
       ),
 [3] => Array ( "destination"=> "Sydney",
               "airlines"=> "airline_3",
               "one_way_fare"=> 180,
               "return_fare => 380
       )
)

return_fare asc, one_way_fare asc로 값을 정렬하려면 어떻게해야합니까?

array_multisort ()를 시도했지만 데이터가 뒤섞이는 결과를 얻었습니다 ..

정렬은 1 차원 배열에서만 작동합니다. 두 개 이상의 값으로 정렬해야합니다. 어떻게하면 SQL 에서처럼 field1 asc, field2 asc로 정렬 할 수 있습니까?


array_multisort() 올바른 기능입니다. 어떻게 든 엉망이되었을 것입니다.

// Obtain a list of columns
foreach ($data as $key => $row) {
    $return_fare[$key]  = $row['return_fare'];
    $one_way_fare[$key] = $row['one_way_fare'];
}

// Sort the data with volume descending, edition ascending
array_multisort($return_fare, SORT_ASC, $one_way_fare, SORT_ASC, $data);

에 대한 PHP 매뉴얼 페이지의 주석을 살펴보면 위의 내용을 다음과 같이 줄일 array_multisort()수있는 매우 유용한 array_orderby()기능을 찾을 수 있습니다.

$sorted = array_orderby($data, 'return_fare', SORT_ASC, 'one_way_fare', SORT_ASC);

루핑 사용을 피하려면 array_column()(PHP 5.5.0부터) :

array_multisort(array_column($data, 'return_fare'),  SORT_ASC,
                array_column($data, 'one_way_fare'), SORT_ASC,
                $data);

뿐만 아니라 array_multisort()첫 번째 빌드 열 배열에 당신을 필요도가 usort()그런 일을 필요로하지 않는다.

usort($data, function($a, $b) { 
    $rdiff = $a['return_fare'] - $b['return_fare'];
    if ($rdiff) return $rdiff; 
    return $a['one_way_fare'] - $b['one_way_fare']; 
}); // anonymous function requires PHP 5.3 - use "normal" function earlier

또는 uasort다음과 같이 사용할 수 있습니다.

uasort($arr, function($a,$b){
    $c = $a['return_fare'] - $b['return_fare'];
    $c .= $a['one_way_fare'] - $b['one_way_fare'];
    return $c;
});

Fiddle


우주선 연산자를 사용하는 또 다른 예입니다.

usort($data, function($a, $b) { 
    return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare'] 
});

정렬하려는 항목 수에 관계없이 일반화 할 수있는 방식으로 대답하겠습니다 .

return_fare그때 정렬 one_way_fare:

usort($data, function($a, $b) {
   if ($a['return_fare'] != $b['return_fare']) {
      return $a['return_fare'] <=> $b['return_fare'];
   }

   return $a['one_way_fare'] <=> $b['one_way_fare'];
});

에 정렬 return_fare한 후 one_way_fare, 다음 destination:

usort($data, function($a, $b) {
   if ($a['return_fare'] != $b['return_fare']) {
      return $a['return_fare'] <=> $b['return_fare'];
   }

   if ($a['one_way_fare'] != $b['one_way_fare']) {
      return $a['one_way_fare'] <=> $b['one_way_fare'];
   }

   return strnatcasecmp($a['destination'], $b['destination']);
});

정렬 return_fare:

usort($data, function($a, $b) {
   return $a['return_fare'] <=> $b['return_fare'];
});

참고 :usort ! 와 함께 익명 함수를 사용할 필요는 없습니다 .

function cmp($a, $b) {
   return $a['return_fare'] <=> $b['return_fare'];
}

usort($data, 'cmp');


// Use a function inside a class:
class MyClass {
   public static function compare($a, $b) {
      return $a['return_fare'] <=> $b['return_fare'];
   }
}

usort($data, ['MyClass', 'compare']);

Elvis 연산자 ( ?:)를 사용하여 연결할 수도 있습니다 .

usort($data, function($a, $b) {
      return $a['return_fare'] <=> $b['return_fare'] ?:
             $a['one_way_fare'] <=> $b['one_way_fare'] ?:
             strnatcasecmp($a['destination'], $b['destination']);
});

이 마지막 예제에서는 우주선 연산자 ( <=>)와 엘비스 연산자 ( ?:)를 사용했습니다. 프로그래밍이 훌륭하지 않습니까?


오, 내 질문을 또 풀었다 ....

function array_multi_sort($array, $on1,$on2, $order=SORT_ASC) 
{

    foreach($array as $key=>$value){
        $one_way_fares[$key] = $value[$on2];
        $return_fares[$key] = $value[$on1];
    }

    array_multisort($return_fares,$order,$one_way_fares,$order,$array);
}

문제는 마지막 매개 변수 $ array on을 놓쳤다는 것입니다. array_multisort($return_fares,$order,$one_way_fares,$order,$array);

일찍이!

참고 URL : https://stackoverflow.com/questions/4582649/php-sort-array-by-two-field-values

반응형