- Сортировка массивов
Печать: Шрифт: Абв Абв Абв
admin 27 Февраля 2006 в 16:40:26
Сортировка массивов

Сортировка занимает важное место в программировании и часто встречается на практике в таких Интернет-приложениях, как коммерческие сайты (сортировка категорий товаров в алфавитном порядке, сортировка цен) или поисковые системы (сортировка программ по количеству загрузок). В РНР существует девять стандартных функций сортировки (табл. 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;
?>


Этот фрагмент выводит следующий результат:

Quote:
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( ) также сортирует массив по пользовательскому критерию, однако сортируются не значения, а ключи.

Комментарии, по рейтингу, по дате
  Rustem888 26.12.2007 в 19:37:25   # 1067
В описании asort грубая ошибка!
  Himic 26.12.2007 в 22:46:37   # 1069
Ага, в этом учебнике куча ошибок, как будто автор делал их специально, чтоб юзер думал, эксперементпровал и пробовал, очень хорошо тренирует программирование на PHP.
Я исписал целую тетрадь со своими примерами и описаниями.
Добавить сообщение
Чтобы добавлять комментарии зарeгиcтрирyйтeсь