8.13: Сортировка массивов
Главная Страница » Книги по PHP » Самоучитель PHP 5 для чайников с примерами » Сортировка массивов в PHP
Теперь вы можете удалять, добавлять и изменять элементы массива. Но на практике зачастую приходится работать не с отдельными элементами, а с массивом в целом. В данном случае речь пойдет о сортировке. Давно прошли те времена, когда нужно было самостоятельно придумывать наилучший алгоритм, например для вывода чисел в порядке возрастания. Сегодня для этого есть очень много полезных функций, с работой которых мы и познакомимся.
Самая простая и, наверное, самая распространенная функция сортировки - sort(). Она располагает элементы массива в алфавитном порядке (листинг 8.17).
Листинг 8.17. Сортировка массива.
‹html›
‹head›
‹title› Сортировка массива ‹/title›
‹/head›
‹body›
‹?php
$closets = array(0 => "Шорты", 1 => "Майка", 2 => "Кроссовки");
sort($closets);
foreach ($closets as $key => $value)
{
echo $key . " " . $value . "‹br›"; // вывод элемента
}
?›
‹/body›
‹/html›
Результат выполнения этой программы смотрите ниже.
В этом примере индексы остались неизменны, но это лишь частный случай. На самом деле, какие бы у нас не были ключи до сортировки, функция sort() сама индексирует элементы, начиная с нуля (листинг 8.18).
Листинг 8.18. Особенности сортировки массива с помощью функции sort().
‹html›
‹head›
‹title› Особенности сортировки массива с помощью функции sort()‹/title›
‹/head›
‹body›
‹?php
$closets = array( 3 => "Шорты", 4 => "Майка", 1 => "Кроссовки");
sort($closets);
foreach ($closets as $key => $value)
{
echo $key . " " . $value . "‹br›"; // вывод элемента
}
?›
‹/body›
‹/html›
Результат выполнения листинг 8.18 смотрите ниже:
Как видим, результат точно такой же, как и в первом случае. В связи с этим стоит быть осторожнее при сортировке массивов, где индексация имеет значение. Например, если вы в качестве ключей используете строки, то функция sort() все равно заменит их числами.
Еще одна особенность этой функции - необязательный параметр (флаг), который указывает на тип сортируемых значений (листинг 8.19).
Листинг 8.19. Использование необязательных параметров.
‹html›
‹head›
‹title› Использование необязательных параметров ‹/title›
‹/head›
‹body›
‹?php
$closets_1 = array (0 => 2, 1 => 3, 2 => "Кроссовки");
sort($closets_1, SORT_NUMERIC);
foreach ($closets_1 as $key => $value)
{
echo $key . " " . ;value . "‹br›"; // вывод элемента
}
$closets_2 = array (0 => 2, 1 => 3, 2 => "Кроссовки");
sort($closets_2, SORT_STRING);
foreach ($closets_2 as ;key => ;value)
{
echo ;key . " " . ;value . "‹br›"; // вывод элемента
}
?›
‹/body›
‹/html›
В первом случае функция воспринимает все значения как числа, поэтому Кроссовки оказались на месте первого элемента (строка преобразовалась в число 0). Во втором случае значения сортируются как строки, поэтому на этот раз строка Кроссовки оказалась на месте последнего элемента. Существует так же третий флаг - S0RT_REGULAR, который указывает на обычную сортировку.
Стоит отметить, что эти необязательные параметры функции sort() появились только в четвертой версии РНР.
Как мы уже говорили, функцию sort() неудобно применять к массивам, где нужно сохранять значение ключей. Для решения этой проблемы применяют функцию asort(), которая работает по аналогичному принципу, но не изменяет индексы элементов (листинг 8.20).
Листинг 8.20. Сортировка массива с помощью функции asort().
‹html›
‹head›
‹title› Сортировка массива с помощью функции asort() ‹/title›
‹/head›
‹body›
‹?php
$closets = array (3 => "Шорты", 4 => "Майка", 1 => "Кроссовки");
asort($closets);
foreach ($closets as $key => $value)
{
echo $key . " " . $value . "‹br›"; // вывод элемента
}
?›
‹/body›
‹/html›
Результат выполнения этой программы смотрите ниже.
Как видим, результаты сортировок одинаковые за исключением того, что индекса элементов остались прежними. Необязательные параметры также присутствуют в этой функции и работают по такому же принципу.
Часто встречаются случаи, когда надо отсортировать элементы массива в обратном порядке. Для этого применяются функции rsort() и arsort(), которые в пояснениях не нуждаются, так как работают аналогично разобранным функциям.
Если есть сортировка элементов массива по значению, то логично было бы добавить сортировку по ключу. Именно эту задачу выполняет функция ksort() - листинг 8.21.
Листинг 8.21. Сортировка массива с помощью функции ksort().
‹html›
‹head›
‹title› Сортировка массива с помощью функции kSort() ‹/title›
‹/head›
‹body›
‹?php
$closets = array ("Петров"=>"Майка", "Иванов"=>"Кроссовки", "Сидоров"=>"Шорты");
ksort ($closets);
foreach ($closets as $key => $value)
{
echo $key . " " . $value . "‹br›"; // вывод элемента
}
?›
‹/body›
‹/html›
Результат выполнения этой программы смотрите ниже на рисунке.
Наверное, стоит добавить, что существует функция krsort(), которая, как вы поняли, сортирует массив в обратном порядке.