Язык программирования PHP | страница 65




>

>$books = array("Пушкин"=>"Руслан и Людмила",

> "Толстой"=>"Война и мир",

> "Лермонтов"=>"Герой нашего времени");

>ksort($books);

> // сортируем массив,

> // сохраняя значения ключей

>print_r($books);

>?>



Получим:


>Array ( [Лермонтов] => Герой нашего времени

> [Пушкин] => Руслан и Людмила

> [Толстой] => Война и мир )



Сортировка с помощью функции, заданной пользователем


Кроме двух простых способов сортировки значений массива (по убыванию или по возрастанию) PHP предлагает пользователю возможность самому задавать критерии для сортировки данных. Критерий задается с помощью функции, имя которой указывается в качестве аргумента для специальных функций сортировки usort() или uksort(). По названиям этих функций можно догадаться, что usort() сортирует значения элементов массива, а uksort() – значения ключей массива с помощью определенной пользователем функции. Обе функции возвращают true, если сортировка прошла успешно, и false – в противном случае. Их синтаксис выглядит следующим образом:


>usort (массив , сортирующая функция)

>uksort (массив , сортирующая функция)


Конечно же, нельзя сортировать массив с помощью любой пользовательской функции. Эта функция должна удовлетворять определенным критериям, позволяющим сравнивать элементы массива. Как должна быть устроена сортирующая функция? Во-первых, она должна иметь два аргумента. В них интерпретатор будет передавать пары значений элементов для функции usort() или ключей массива для функции uksort(). Во-вторых, сортирующая функция должна возвращать:


- целое число, меньшее нуля, если первый аргумент меньше второго;


- число, равное нулю, если два аргумента равны;


- число большее нуля, если первый аргумент больше второго.


Как и для других функций сортировки, для функции usort() существует аналог, не изменяющий значения ключей, – функция uasort().


Пример 7.10. Допустим, у нас есть массив, содержащий такие сведения о литературных произведениях, как название, автор и год создания. Мы хотим упорядочить книги по дате создания.


>

>// массив выглядит таким образом:

>$books = array("Герой нашего времени" =>

> array ("Лермонтов", 1840),

> "Руслан и Людмила" => array("Пушкин",1820),

> "Война и мир" => array ("Толстой",1863),

> "Идиот" => array("Достоевский",1868));

>/* можно, конечно переписать этот массив

>по-другому, сделав год издания, например,

>индексом, но гораздо удобнее написать свою

>функцию для сортировки */