Массив сортировки PHP по двум значениям поля
У меня есть массив вроде этого
Array (
[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(), но в итоге я начал смешивать данные.
asort работает только для одномерного массива, мне нужно сортировать по двум значениям или более, как я могу достичь этого, как в SQL, упорядочить по полю 1 asc, field2 asc?
Ответы
Ответ 1
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);
Ответ 2
В дополнение к 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
Ответ 3
Или вы можете использовать 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
Ответ 4
Другой пример использования оператора космического корабля.
usort($data, function($a, $b) {
return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare']
});
Ответ 5
Я отвечу на это таким образом, который можно обобщить, независимо от того, сколько предметов вы хотите отсортировать!
Сортировка по 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']);
Вы также можете связать их с помощью оператора Элвиса (?:
:
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']);
});
В последнем примере использовался оператор космического корабля (<=>
) и оператор Элвиса (?:
. Разве программирование не прекрасно?
Ответ 6
Ох, мне удалось решить свой вопрос снова....
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 в array_multisort($return_fares,$order,$one_way_fares,$order,$array);
ранее!