ГЛАВА 5. Массивы
Сортировка массивов
Сортировка занимает важное место в программировании и часто встречается на практике в таких Интернет-приложениях, как коммерческие сайты (сортировка категорий товаров в алфавитном порядке, сортировка цен) или поисковые системы(сортировка программ по количеству загрузок). В РНР существует девять стандартных функций сортировки (табл. 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] <br>";
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<br>";
}
В листинге 5.2 функция compare_length() определяет критерий сортировки массива. В данном случае это делается посредством сравнения длины передаваемых элементов. Функция-критерий должна получать два параметра, представляющих сравниваемые элементы массива. Также обратите внимание на то, как эти элементы неявно передаются функции-критерию при вызове usort(), и на то, что все элементы автоматически сравниваются этой функцией.
Функции uasort() и uksort() представляют собой разновидности usort() с тем же синтаксисом. Функция uasort() сортирует массив по пользовательскому критерию с сохранением ассоциаций «ключ/значение». Функция uksort() также сортирует массив по пользовательскому критерию, однако сортируются не значения, а ключи.
Назад |
Содержание раздела |
Общее Содержание |
Вперед
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|