Версия для печати. Взято с сайта phpsql.ru

На главную   Назад   Вперед

6: Сортировка сложных массивов

Сортировка многомерных массивов

Одна из задач программирования заключается в сортировке сложных (многомерных) массивов. Например, представим, что у нас есть следующий массив:

$items = array(
array("name" => "Mojo Nixon", "price" => 19.96, "quantity" => 2), 
array("name" => "ABBA", "price" => 14.99,  "quantity" => 1), 
array("name" => "Iced Earth", "price" => 12.96, "quantity" => 4),
);
Ваша цель заключается в сортировке ключей в каждом подмассиве. РНР, подобно многим другим языкам программирования, имеет функцию сортировки, которая называется usort (), позволяющую задать пользователь-скую функцию сравнения. Другими словами, вы можете сортировать массив в соответствии с любыми заданными вами критериями, при этом вам не нужно быть знакомыми с алгоритмами сортировки. Для сортировки имен с помощью usort () можно использовать следующую пользовательскую функцию:
function name_cmp($a,  $b)   {
return strcasecmp($a["name"],  $b["name"]);
}
usort ($items,  "name__cmp") ;
Пользовательская функция сравнения называется name__cmp. Функция usort () использует эту функцию для сравнения двух элементов, которые передаются нашей функции сравнения в качестве аргументов (здесь $а и $b). Функция будет возвращать следующие результаты:
• Если $а меньше, чем $b, будет возвращено -1.
• Если $а равно $b, будет возвращено 0.
• Если $а больше, чем $b, будет возвращено 1.

Поскольку $а и $b - массивы, то мы будем сравнивать значения, при-надлежащие к ключу name, то есть мы будем сравнивать $a["namelf] с $b["name"]. Для сравнения элементов можно использовать конструкцию if /then, но поскольку мы будем сравнивать строки, то намного проще вызвать функцию strcasecmp () - так будет быстрее и надежнее.

Примечание.
Для сортировки многомерных массивов в РНР можно использовать функцию array_multisort (). Однако ее проще не использовать, чем использовать, поэтому избегайте ее.

Совершенствуем сценарий Наиболее очевидная модификация, которую вам захочется сделать в функции сравнения — это добавление дополнительных критериев сортировки в случае, если два элемента равны. В следующем примере исследуется поле price, если названия элементов одинаковые:

function name_cmp($a,  $b)   {
$r = strcasecmp($a["name"],  $b["name"]); 
if  ($r == 0)   {
if  ($a["price"]  < $b["price"]) { 
$r = -1;
} elseif ($a["price"]  > $b["price"])   {
$r = 1; 
} else {
$r = 0;
/* Not strictly necessary;  $r is already 0.  */
}
}
return($r);
}

 
Предыдущая   На главную   Следующая