И, наконец, последняя функция, которая описывается в данном разделе, - это 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 сравнивает элемент, хранящий зарплату, но если зарплаты двух служащих равны, то сравниваются их имена.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
PHP. Сортировка, поиск и случайные числа. Часть Третья.
19-05-2015
<< Предыдущая статья | Следующая статья >> |
PHP. Сортировка, поиск и случайные числа. Часть Вторая. | PHP. Сортировка, поиск и случайные числа. Часть Четвёртая. |