П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 174944 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 71862 раз(а).

Учебник HTML.
Просмотров 72021 раз(а).

Руководство по PHP5.
Просмотров 42629 раз(а).

Хостинг через призму DNS.
Просмотров 49089 раз(а).

Подборка текстов стандартных документов.
Просмотров 43046 раз(а).

Учебник PHP - Самоучитель
Просмотров 49391 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 49625 раз(а).

Внешние атаки...
Просмотров 40178 раз(а).

Учебник PHP.
Просмотров 35203 раз(а).

SSI в примерах.
Просмотров 26510 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь




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

Назад | Содержание раздела | Общее Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru