- Сортировка массивов
admin 27 Февраля 2006 в 16:40:26
Сортировка массивов
Сортировка занимает важное место в программировании и часто встречается на практике в таких Интернет-приложениях, как коммерческие сайты (сортировка категорий товаров в алфавитном порядке, сортировка цен) или поисковые системы (сортировка программ по количеству загрузок). В РНР существует девять стандартных функций сортировки (табл. 5.1), причем каждая функция сортирует массив особым образом.
Таблица 5.1. Функции сортировки
? - относится к применению пользовательских функций сортировки, когда порядок сортировки массива зависит от результатов, возвращаемых пользовательской функцией.
Сортировка элементов массива не ограничивается стандартными критериями, поскольку три функции (usort(), uasort( ) и uksort( )) позволяют задать пользовательский критерий и отсортировать информацию произвольным образом.
sort( )
Простейшая функция sort( ) сортирует элементы массива по возрастанию (от меньших к большим). Синтаксис функции sort ( ):
Нечисловые элементы сортируются в алфавитном порядке в соответствии с ASCII-кодами. Следующий пример демонстрирует применение функции sort( ) при сортировке:
Этот фрагмент выводит следующий результат:
Quote:
Как видите, массив $cities сортируется в алфавитном порядке. Одна из разновидностей этого способа сортировки реализована в функции asort( ), описанной ниже.
rsort( )
Функция rsort ( ) работает точно так же, как функция sort ( ), за одним исключением: элементы массива сортируются в обратном порядке. Синтаксис функции rsort ( ):
Вернемся к массиву $cities из предыдущего примера:
В результате сортировки массива $cities функцией rsort( ) элементы будут расположены в следующем порядке:
Массив $cities также сортируется, но на этот раз в порядке, обратном алфавитному. Одна из разновидностей этого способа сортировки реализована в функции arsort( ), описанной ниже.
asort( )
Функция asort( ) работает почти так же, как упоминавшаяся выше функция sort( ), однако она сохраняет исходную ассоциацию индексов с элементами независимо от нового порядка элементов. Синтаксис функции asort( ):
Вернемся к массиву $cities:
В результате сортировки массива $cities функцией rsort() элементы будут расположены в следующем порядке:
Обратите внимание на индексы и сравните их с приведенными в описании функции sort ( ). Именно в этом и состоит различие между двумя функциями.
arsort( )
Функция arsort ( ) представляет собой разновидность asort( ), которая сохраняет исходную ассоциацию индексов, но сортирует элементы в обратном порядке. Синтаксис функции arsort( ):
Воспользуемся функцией arsort( ) для сортировки массива $cities:
В результате сортировки элементы будут расположены в следующем порядке:
Обратите внимание на индексы и сравните их с приведенными в описании функции rsort( ). Именно в этом и состоит различие между двумя функциями.
ksort( )
Функция ksort( ) сортирует массив по ключам, сохраняя исходные ассоциации ключей со значениями. Синтаксис функции ksort( ):
void ksort (array массив)
Для примера рассмотрим массив, слегка отличающийся от исходного массива
$cities:
В результате сортировки массива функцией ksort( ) элементы будут расположены в следующем порядке:
Сравните с результатами сортировки $wine_producers функцией sort ( ):
Более чем сомнительный результат!
krsort( )
Функция krsort( ) почти аналогична ksort( ), однако ключи сортируются в обратном порядке. Синтаксис функции krsort( ):
Рассмотрим сортировку массива $wi reproducers функцией krsort( ):
В результате сортировки элементы будут расположены в следующем порядке:
Вероятно, описанных выше функций сортировки будет вполне достаточно для большинства случаев. Тем не менее, в некоторых ситуациях может возникнуть необходимость в определении собственных критериев сортировки. В РНР такая возможность реализована в трех стандартных функциях: usort( ), uasort( ) и uksort( ).
usort( )
Функция usort( ) дает возможность отсортировать массив на основании критерия, определяемого программистом. Для этого usort( ) в качестве параметра передается имя функции, определяющей порядок сортировки. Синтаксис функции usort( ):
В параметре массив передается имя сортируемого массива, а в параметре имя_функции — имя функции, на основании которой будет осуществляться сортировка. Допустим, у вас имеется длинный список греческих имен, которые необходимо выучить к предстоящему экзамену по истории. Вы хотите отсортировать слова по длине, чтобы начать с самых длинных, а затем учить короткие, когда вы уже устанете. Для сортировки массива по длине можно воспользоваться функцией usort( ).
Листинг 5.2. Определение критерия сортировки для функции usort( )
В листинге 5.2 функция compare_length ( ) определяет критерий сортировки массива. В данном случае это делается посредством сравнения длины передаваемых элементов. Функция-критерий должна получать два параметра, представляющих
сравниваемые элементы массива. Также обратите внимание на то, как эти элементы неявно передаются функции-критерию при вызове usort( ), и на то, что все элементы автоматически сравниваются этой функцией.
Функции uasort( ) и uksort( ) представляют собой разновидности usort( ) с тем же синтаксисом. Функция uasort() сортирует массив по пользовательскому критерию с сохранением ассоциаций «ключ/значение». Функция uksort( ) также сортирует массив по пользовательскому критерию, однако сортируются не значения, а ключи.
Сортировка занимает важное место в программировании и часто встречается на практике в таких Интернет-приложениях, как коммерческие сайты (сортировка категорий товаров в алфавитном порядке, сортировка цен) или поисковые системы (сортировка программ по количеству загрузок). В РНР существует девять стандартных функций сортировки (табл. 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[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( ) также сортирует массив по пользовательскому критерию, однако сортируются не значения, а ключи.
|