И, наконец, последняя функция, которая описывается в данном разделе, - это ksort. Данная функция позволяет сортировать массив по значениям индексов. Внесем изменения в листинг 21.3, чтобы вместо функции arsort воспользоваться функцией ksort. Заметим, что теперь все элементы массива будут располагаться в порядке следования индексов или ключей.
Функция ksort, вероятно, наиболее полезна в случаях, когда в распоряжении разработчика имеется ассоциативный массив, и у него нет полного контроля над содержимым массива. В листинге 21.4 сценарий получает массив, созданный функцией getdate. Если запустить его с закомментированной строкой ksort, вы сможете убедиться в том, что порядок следования элементов является произвольным. Это порядок, выбранный при создании функции. Здесь можно распечатать пару строк для каждого элемента, приведенного в описании функции getdate (см. главу 14, "Функции даты и времени"). Более читаемым решением является сортировка элементов по ключам и распечатка их в цикле. Как нетрудно догадаться, функция krsort сортирует массив по индексам в обратном порядке.

| Листинг 21.4. Использование функции ksort_
<?php
//Получить массив от функции getdate $today = getdate();
// Отсортировать массив, сохраняя индексы ksort($today);
//Распечатать массив, отсортированный по ключам
print("<pre>");
print_r($today);*
print("</pre>n");
?> 
21.3. Сортировка с помощью функций сравнения
Встроенные функции сортировки соответствуют большинству задач. Но если для выполнения поставленной задачи требуется процедура сортировки, обладающая более совершенными характеристиками, чем те, которые предлагают встроенные функции, разработчик может запрограммировать свои собственные функции. Если для решения задачи требуется сравнить такие сложные элементы, как объекты или многомерные массивы, решение можно найти в написании функции сравнения и включения ее в функцию usort.
Функция usort позволяет отсортировать массив с помощью функции сравнения, разработанной программистом. Такая функция сравнения должна принимать два значения и возвращать целое число. Значения двух аргументов сравниваются, и если возвращается отрицательное число, то значения считаются упорядоченными. При возвращении нуля значения считаются равными. Положительное значение означает, что порядок значений нарушен.
В листинге 21.5 автором создан многомерный массив с тремя элементами, соот­ветствующим имени, должности и почасовой ставке. Это сделано для того, чтобы иметь возможность перечислять работников по именам, но иногда может потребоваться сравнить их по должностям или по заработной плате. Для решения этой проблемы автором были созданы три функции сравнения. Результат работы сценария показан на рис. 21.4.

Листинг 21.5. Использование функции usort

<?php
class EmployeeTracker
{
static $title = array( "President"=>1, "Executive"=>2, "Manager"=>3, "Programmer"=>4
);
public $employees;
public function __construct($data)
{
$this->employees = $data;
}
// byName
// сравнение служащих по именам function byName($left, $right)
{
return(strcmp($left[0], $right[0]));
}
// byTitle
// сравнение служащих по должностям function byTitle($left, $right)
{
if($left[1] == $right[1])
{
return(0); 
}
else
{
return(EmployeeTracker::$title[$left[1]] -EmployeeTracker::$title[$right[1]]);
}
}
// bySalary
// сравнение служащих сначала по зарплате, а затем по именам function bySalary($left, $right)
{
if($left[2] == $right[2])
{
return(byName($left, $right));
}
else
{
return($right[2] - $left[2]);
}
}
// printEmployees
// отправить полный список служащих в браузер function printEmployees()
{
foreach($this->employees as $value)
{
printf("%s (%s) %.2f/Hour <br>n", $value[0], $value[1], $value[2]);
}
}
}
// Создать список служащих (имя, должность, ставка) $e = new EmployeeTracker(array(
array("Mckillop, Jeff", "Executive", 50),
array("Porter, Carl", "Manager", 45),
array("Marazzani, Rick", "Manager", 35),
array("Dibetta, Bob", "Programmer", 65),
array("Atkinson, Leon", "President", 100))); print("<b>Не отсортированьк/bxbr^n"),-$e->printEmployees();
print("<B>Отсортированы по имени</B><br>n"),•
usort($e->employees, array($e, "byName")); $e->printEmployees();
print("<b> Отсортированы по должности</Ь><Ьг>п"); usort($e->employees, array($e, "byTitle")); $e->printEmployees();
print("<b> Отсортированы по ставке</b><br>n"),• usort($e->employees, array($e, "bySalary")); $e->printEmployees();
?>
Сортировка, поиск и случайные числа
Функция byName использует функцию strcmp. Имена сортируются по ASCII-кодам. Функция byTitle присваивает целое значение каждой должности и возвращает результат сравнения этих целых чисел. Функция bySalary сравнивает элемент, хранящий зарплату, но если зарплаты двух служащих равны, то сравниваются их имена.