Изучаем PHP программирование

   Search   

Русская версия | English version   

Скрипты :: Секреты профессионалов :: Link :: FAQ   Пишите письма  



 

главная :: основы PHP

Сортировка массивов

Сортировка занимает важное место в программировании и часто встречается на практике в таких Интернет-приложениях, как коммерческие сайты (сортировка категорий товаров в алфавитном порядке, сортировка цен) или поисковые системы (сортировка программ по количеству загрузок). В РНР существует девять стандартных функций сортировки (табл. 5.1), причем каждая функция сортирует массив особым образом. Таблица 5.1. Функции сортировки Функция Сортировка Обратный порядок Сохранение пар «ключ/значение» sort Значение Нет Нет rsort Значение Да Нет asort Значение Нет Да arsort Значение Да Да ksort Ключ Нет Да krsort Ключ Да Да usort Значение ? Нет uasort Значение ? Да uksort Ключ ? Да ? относится к применению пользовательских функций сортировки, когда порядок сортировки массива зависит от результатов, возвращаемых пользовательской функцией. Сортировка элементов массива не ограничивается стандартными критериями, поскольку три функции (usort(), uasort( ) и uksort( )) позволяют задать пользовательский критерий и отсортировать информацию произвольным образом. sort( ) Простейшая функция sort( ) сортирует элементы массива по возрастанию (от меньших к большим). Синтаксис функции sort ( ): void sort (array массив) Нечисловые элементы сортируются в алфавитном порядке в соответствии с ASCII-кодами. Следующий пример демонстрирует применение функции sort( ) при сортировке: // Создать массив городов. $cities = array("Aprilia", "Nettuno", "Roma", "Venezia", "Anzio"); // Отсортировать города по возрастанию sort($cities); // Перебрать содержимое массива и вывести все пары "ключ/значение". for (reset($cities); $key = key ($cities); next ($cities)): print("cities[$key] = $cities[$key]
"; endfor; Этот фрагмент выводит следующий результат: cities[0] = Anzio cities[1] = Aprilia cities[2] = Nettuno cities[3] = Roma cities[4] = Venezia Как видите, массив $cities сортируется в алфавитном порядке. Одна из разновидностей этого способа сортировки реализована в функции asort( ), описанной ниже. rsort( ) Функция rsort ( ) работает точно так же, как функция sort ( ), за одним исключением: элементы массива сортируются в обратном порядке. Синтаксис функции rsort ( ): void rsort (array массив) Вернемся к массиву $cities из предыдущего примера: $cities array("Aprilia", "Nettuno", "Roma", "Venezia", "Anzio"); rsort($cities); В результате сортировки массива $cities функцией rsort( ) элементы будут расположены в следующем порядке: cities[0] = Venezia cities[1] = Roma cities[2] = Nettuno cities[3] = Aprilia cities[4] = Anzio Массив $cities также сортируется, но на этот раз в порядке, обратном алфавитному. Одна из разновидностей этого способа сортировки реализована в функции arsort( ), описанной ниже. asort( ) Функция asort( ) работает почти так же, как упоминавшаяся выше функция sort( ), однако она сохраняет исходную ассоциацию индексов с элементами независимо от нового порядка элементов. Синтаксис функции asort( ): void asort(array массив) Вернемся к массиву $cities: $cities = array("Aprilia", "Nettuno", "Roma", "Venezia", "Anzio"); asort($cities): В результате сортировки массива $cities функцией rsort() элементы будут расположены в следующем порядке: cities[4] = Anzio cities[0] = Aprilia cities[1] = Nettuno cities[2] = Roma cities[3] = Venezia Обратите внимание на индексы и сравните их с приведенными в описании функции sort ( ). Именно в этом и состоит различие между двумя функциями. arsort( ) Функция arsort ( ) представляет собой разновидность asort( ), которая сохраняет исходную ассоциацию индексов, но сортирует элементы в обратном порядке. Синтаксис функции arsort( ): void arsort (array массив) Воспользуемся функцией arsort( ) для сортировки массива $cities: $cities = array("Aprilia", "Nettuno", "Roma", "Venezia", "Anzio"); arsort($cities); В результате сортировки элементы будут расположены в следующем порядке: cities[3] = Venezia cities[2] = Roma cities[l] = Nettuno cities[0] = Aprilia cities[4] = Anzio Обратите внимание на индексы и сравните их с приведенными в описании функции rsort( ). Именно в этом и состоит различие между двумя функциями. ksort( ) Функция ksort( ) сортирует массив по ключам, сохраняя исходные ассоциации ключей со значениями. Синтаксис функции ksort( ): void ksort (array массив) Для примера рассмотрим массив, слегка отличающийся от исходного массива $cities: $wine_producers = array ("America" => "Napa Valley", "Italy" => "Tuscany", "Australia" => "Ruthgerlen", "France" => "Loire", "Chile" => "Rapel Valley"); В результате сортировки массива функцией ksort( ) элементы будут расположены в следующем порядке: "America" => "Napa Valley" "Australia" => "Ruthgerlen" "Chile" => "Rapel Valley" "France" => "Loire" "Italy" => "Tuscany" Сравните с результатами сортировки $wine_producers функцией sort ( ): "America" => "Napa Valley" "Australia" => "Tuscany" "Chile" => "Ruthgerlen" "France" => "Loire" "Italy" => "Rapel Valley" Более чем сомнительный результат! krsort( ) Функция krsort( ) почти аналогична ksort( ), однако ключи сортируются в обратном порядке. Синтаксис функции krsort( ): void krsort (array $массив) Рассмотрим сортировку массива $wi reproducers функцией krsort( ): $wine_producers = array ("America" => "Napa Valley", "Italy" => "Tuscany", "Australia" => "Ruthgerlen", "France" => "Loire". "Chile" => "Rapel Valley"); krsort($wine_producers); В результате сортировки элементы будут расположены в следующем порядке: "Italy" => "Tuscany" "France" => "Loire" "Chile" => "Rapel Valley" "Australia" => "Ruthgerlen" "America" => "Napa Valley" Вероятно, описанных выше функций сортировки будет вполне достаточно для большинства случаев. Тем не менее, в некоторых ситуациях может возникнуть необходимость в определении собственных критериев сортировки. В РНР такая возможность реализована в трех стандартных функциях: usort( ), uasort( ) и uksort( ). usort( ) Функция usort( ) дает возможность отсортировать массив на основании критерия, определяемого программистом. Для этого usort( ) в качестве параметра передается имя функции, определяющей порядок сортировки. Синтаксис функции usort( ): void usort (array массив, string имя_функции) В параметре массив передается имя сортируемого массива, а в параметре имя_функции — имя функции, на основании которой будет осуществляться сортировка. Допустим, у вас имеется длинный список греческих имен, которые необходимо выучить к предстоящему экзамену по истории. Вы хотите отсортировать слова по длине, чтобы начать с самых длинных, а затем учить короткие, когда вы уже устанете. Для сортировки массива по длине можно воспользоваться функцией usort( ). Листинг 5.2. Определение критерия сортировки для функции usort( ) $vocab = аrrау( "Socrates", "Aristophanes", "Plato", "Aeschylus", "Thesmophoriazusae"); function compare_length($str1, $str2) { // Получить длину двух следующих слов $length1 = strlen($str1); $length2 = strlen($str2); // Определить, какая строка имеет меньшую длину if ($length1 == $length2) : return 0; elseif ($length1 < $length2) : return -1; else : return 1; endif; } // Вызвать usort() с указанием функции compare_length() // в качестве критерия сортировки usort ($vocab, "compare_length") : // Вывести отсортированный список while (list ($key, $val) = each ($vocab)) { echo "$val
"; } В листинге 5.2 функция compare_length ( ) определяет критерий сортировки массива. В данном случае это делается посредством сравнения длины передаваемых элементов. Функция-критерий должна получать два параметра, представляющих сравниваемые элементы массива. Также обратите внимание на то, как эти элементы неявно передаются функции-критерию при вызове usort( ), и на то, что все элементы автоматически сравниваются этой функцией. Функции uasort( ) и uksort( ) представляют собой разновидности usort( ) с тем же синтаксисом. Функция uasort() сортирует массив по пользовательскому критерию с сохранением ассоциаций «ключ/значение». Функция uksort( ) также сортирует массив по пользовательскому критерию, однако сортируются не значения, а ключи.

Designed by Fedin
All right reserved
2003-2004
Hosted by uCoz