Массив сортировки PHP по двум значениям поля

У меня такой массив

 Массив (
  [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'] });