두 필드 값으로 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;
});
우주선 연산자를 사용하는 또 다른 예입니다.
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
'Development Tip' 카테고리의 다른 글
std :: string 설정 여부를 확인하는 방법은 무엇입니까? (0) | 2020.11.26 |
---|---|
MySQL 결과가 PHP에서 반환되었는지 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.26 |
.bashrc에 추가 파일 포함 (0) | 2020.11.26 |
C #에서 목록을 회전하는 가장 쉬운 방법 (0) | 2020.11.26 |
지도 조각 API v2 레이아웃 상단에 버튼을 추가하는 방법 (0) | 2020.11.26 |