У меня такой массив
Массив ( [0] => Массив ("destination" => "Sydney", «авиакомпании» => «авиакомпания_1», «one_way_fare» => 100, "return_fare => 300 ), [2] => Массив («пункт назначения» => «Сидней», «авиакомпании» => «авиакомпания_2», «one_way_fare» => 150, "return_fare => 350 ), [3] => Массив («пункт назначения» => «Сидней», «авиакомпании» => «авиакомпания_3», «one_way_fare» => 180, "return_fare => 380 ) )
Как я могу сортировать значение с помощью return_fare asc, one_way_fare asc?
Я попробовал array_multisort (), но в итоге я перепутал данные.
asort работает только для одномерного массива, мне нужно сортировать по двум значениям или более, как я могу достичь этого, как в SQL, упорядочивать по полю 1 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()
которая не требует такой вещи.
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; });
скрипка
Ох, мне снова удалось решить свой вопрос …
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, $ заказать, $ one_way_fares, $ порядка, $ массив); }
Дело в том, что я пропустил последний параметр $ array на array_multisort ($ return_fares, $ order, $ one_way_fares, $ order, $ array); ранее!
Другой пример использования оператора космического корабля.
usort($data, function($a, $b) { return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare'] });