name=author size=5> </td></tr>
<tr><td>Дата публикации </td><td><input
type=text name=published size=5></td></tr>
</table>
<input type=submit value='Отправить'>
</form>
Будем упорядочивать данные, переданные этой формой, по убыванию их значений, сохраняя при этом значения ключей. Для этого удобно воспользоваться функцией arsort(). Поскольку нам важен только новый порядок элементов, сохраним в новом массиве ключи исходного массива в нужном порядке. Мы сохраняем ключи исходного массива, поскольку они являются именами элементов, из которых конструируется описание документа, а помнить их важно. Итак, получаем такой скрипт:
<?php
print_r($_GET); echo '<br>';
arsort ($_GET);
// сортируем массив в обратном порядке,
// сохраняя ключи
print_r($_GET); echo '<br>';
$ordered_names = array_keys($_GET);
// составляем новый массив
foreach($ordered_names as $key => $val)
echo '$key :$val <br>';
// выводим элементы нового массива
?>
Очевидно, что может возникнуть необходимость в сортировке массива по значениям ключей. Например, если у нас есть массив данных о книгах, как в приведенном выше примере, то вполне вероятно, что мы захотим отсортировать книги по именам авторов. Для этого в PHP также не нужно писать много строк кода – можно просто воспользоваться функцией ksort() для сортировки по возрастанию (прямой порядок сортировки) или krsort() – для сортировки по убыванию (обратный порядок сортировки). Синтаксис этих функций опять же аналогичен синтаксису функции sort().
<?php
$books = array('Пушкин'=>'Руслан и Людмила',
'Толстой'=>'Война и мир',
'Лермонтов'=>'Герой нашего времени');
ksort($books);
// сортируем массив,
// сохраняя значения ключей
print_r($books);
?>
Получим:
Array ( [Лермонтов] => Герой нашего времени
[Пушкин] => Руслан и Людмила
[Толстой] => Война и мир )
Кроме двух простых способов сортировки значений массива (по убыванию или по возрастанию) PHP предлагает пользователю возможность самому задавать критерии для сортировки данных. Критерий задается с помощью функции, имя которой указывается в качестве аргумента для специальных функций сортировки usort() или uksort(). По названиям этих функций можно догадаться, что usort() сортирует значения элементов массива, а uksort() – значения ключей массива с помощью определенной пользователем функции. Обе функции возвращают true, если сортировка прошла успешно, и false – в противном случае. Их синтаксис выглядит следующим образом:
usort (массив , сортирующая функция)
uksort (массив , сортирующая функция)
Конечно же, нельзя сортировать массив с помощью любой пользовательской функции. Эта функция должна удовлетворять определенным критериям, позволяющим сравнивать элементы массива. Как должна быть устроена сортирующая функция? Во-первых, она должна иметь два аргумента. В них интерпретатор будет передавать пары значений элементов для функции usort() или ключей массива для функции uksort(). Во-вторых, сортирующая функция должна возвращать:
- целое число, меньшее нуля, если первый аргумент меньше второго;
- число, равное нулю, если два аргумента равны;
- число большее нуля, если первый аргумент больше второго.
Как и для других функций сортировки, для функции usort() существует аналог, не изменяющий значения ключей, – функция uasort().
Пример 7.10. Допустим, у нас есть массив, содержащий такие сведения о литературных произведениях, как название, автор и год создания. Мы хотим упорядочить книги по дате создания.
<?php
// массив выглядит таким образом:
$books = array('Герой нашего времени' =>
array ('Лермонтов', 1840),
'Руслан и Людмила' => array('Пушкин',1820),
'Война и мир' => array ('Толстой',1863),
'Идиот' => array('Достоевский',1868));
/* можно, конечно переписать этот массив
по-другому, сделав год издания, например,
индексом, но гораздо удобнее написать свою
функцию для сортировки */