2016-10-24 2 views
0

Можно ли заказать нижеследующее значение для дочерних массивов, например: возраст или высота?PHP: Как заказать массив по значению дочернего массива

array (
    "John" => array (
    "height"=>175, 
    "weight"=>85, 
    "age"="24" 
), 
    "Phil" => array (
    "height"=>185, 
    "weight"=>75, 
    "age"="22" 
) 
"Jim" => array (
    "height"=>195, 
    "weight"=>140, 
    "age"="29" 
) 
) 

Например, вывод заказа по возрасту будет следующим: Фил, Джон, Джим.

Возможно ли это с помощью PHP?

ответ

2

Использования usort: Если вы все еще на PHP 5.2 или выше, вы должны определить функцию сортировки первый:

function sortByAge($a, $b) { 
    return $a['age'] - $b['age']; 
} 

usort($myArray, 'sortByAge'); 

Начиная с PHP 5.3, вы можете использовать анонимную функцию:

usort($myArray, function($a, $b) { 
    return $a['age'] - $b['age']; 
}); 

И, наконец, с PHP 7 вы можете использовать "космический корабль оператор":

usort($myArray, function($a, $b) { 
    return $a['age'] <=> $b['age']; 
}); 

Источник: Sort Multi-dimensional Array by Value

+0

Простите мое невежество, но как это работает? Разве вы не сравниваете 2 возраста ($ a и $ b)? – MeltingDog

+0

PHP должен знать, как сравнивать любые 2 значения в массиве, тогда он сможет сортировать. Это то, как вы объясняете PHP, как сравнивать. – luchaninov

2

Объявляет пользовательскую функцию для сравнения массива ребенка и использовать usort для сортировки с помощью обратного вызова функции

function cmp($a, $b) 
{ 
    if ($a['height'] == $b['height']) { 
     return 0; 
    } 
    return ($a['height'] < $b['height']) ? -1 : 1; 
} 

$a = array(3, 2, 5, 6, 1); 

usort($a, "cmp"); 
1
// sort by height in increasing order 
$sorter = function($a,$b){return $a['height']-$b['height'];}; 

usort($myArr, $sorter); 

live demo

0

Использование uasort, определяемые пользователем сортировкой, что позволяет обеспечить ваш собственной функции, чтобы определить, должен ли один элемент переходить к другому.

http://www.php.net/manual/en/function.uasort.php

Ваша функция компаратора будет что-то вроде

function cmp($a, $b) { 
    return $a['height'] > $b['height'] ? 1 : -1; 
} 
+0

Функция сравнения должна/должна возвращать значение <0, 0, or > 0; а не только '-1' или' 1'. Даже если результат может быть идентичным, он не соответствует API. В худшем случае сортировка будет менее эффективной, поскольку вы неправильно сигнализируете «usort», когда два значения равны. – deceze

Смежные вопросы