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);
Или можно использовать 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'];
});
Примечание: Вы не должны использовать анонимную функцию с [1 111]!
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']);
});
Этот последний пример использовал Оператор (<=>
) Космического корабля и Оператор (?:
) Elvis. Разве программирование не является большим?
В дополнение к 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
Ohh, мне удалось решить мой собственный вопрос снова....
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);
ранее!