|
Сортировка массивов
ADO в Delphi AJAX Android C++ CakePHP CMS COM CSS Delphi Flash Flex HTML Internet Java JavaScript MySQL PHP RIA SCORM Silverlight SQL UML XML Бази даних Веб-розробка Генетичні алгоритми ГІС Гітара Дизайн Економіка Інтелектуальні СДН Колір Масаж Математика Медицина Музика Нечітка логіка ООП Патерни Подання знань Розкрутка сайту, SEO САПР Сесії в PHP Системне програмування Системний аналіз Тестологія Тестування ПЗ Фреймворки Штучний інтелект
|
Сортировка массивов
Сортировка массивовНеобходимость сортировки данных, в том числе и данных, хранящихся в виде массивов, очень часто возникает при решении самых разнообразных задач. Если в языке Си для того, чтобы решить эту задачу, нужно написать десятки строк кода, то в PHP это делается одной простой командой. Функция sortФункция sort имеет следующий синтаксис sort (массив [, флаги]) и сортирует массив, т.е. упорядочивает его значения по возрастанию. Эта функция удаляет все существовавшие в массиве ключи, заменяя их числовыми индексами, соответствующими новом порядку элементов. В случае успешного завершения работы она возвращает true, иначе – false. Пример 7.6. Пусть у нас есть два массива: цены товаров – их названия и, наоборот, названия товаров – их цены. Упорядочим эти массивы по возрастанию: $items = array(10 => "хлеб", 20 => "молоко",
30 => "бутерброд");
sort($items);
// строки сортируются в алфавитном
// порядке, ключи теряются
print_r($items);
$rev_items = array("хлеб" => 10,
"бутерброд" => 30, "молоко" => 20);
sort($rev_items);
// числа сортируются по возрастанию,
// ключи теряются
print_r($rev_items);
?>
Пример 7.6. Применение
функции sort()Получим: Array ( [0] => бутерброд [1] =>
молоко [2] => хлеб )
Array ( [0] => 10 [1] => 20 [2] => 30 )
В качестве дополнительного аргумента флаги может использоваться одна из следующих констант:
Функции asort, rsort, arsortЕсли требуется сохранять индексы элементов массива после сортировки, то нужно использовать функцию asort (массив [, флаги]). Если необходимо отсортировать массив в обратном порядке, т.е. от наибольшего значения к наименьшему, то можно задействовать функцию rsort (массив [, флаги]). А если при этом нужно еще и сохранить значения ключей, то следует использовать функцию arsort(массив [, флаги]). Как вы, наверное, заметили синтаксис у этих функций абсолютно такой же, как у функции sort. Соответственно и значения флагов могут быть такими же, как у sort: SORT_REGULAR, SORT_NUMERIC, SORT_STRING. Кстати говоря, флаг SORT_NUMERIC появился только в PHP4. <?php
$books = array("Пушкин"=>"Руслан и Людмила",
"Толстой"=>"Война и мир",
"Лермонтов"=>"Герой нашего времени");
asort($books);
// сортируем массив,
// сохраняя значения ключей
print_r($books);
echo "<br>";
rsort($books);
// сортируем массив в обратном порядке,
// ключи будут заменены
print_r($books);
?>
Пример 7.7. Применение
функций asort, rsort, arsortВ результате работы этого скрипта получим: Array ( [Толстой] => Война и мир
[Лермонтов] => Герой нашего времени
[Пушкин] => Руслан и Людмила )
Array ( [0] => Руслан и Людмила
[1] => Герой нашего времени
[2] => Война и мир )
Пример 7.8. Допустим, мы создаем каталог описаний документов. У каждого документа есть автор, название, дата публикации и краткое содержание. Мы уже не раз отображали описания, составленные из этих характеристик. Каждый раз порядок отображения этих элементов зависел от созданной нами программы. Теперь же мы хотим иметь возможность изменять порядок отображения элементов по желанию пользователя. Составим для этого следующую форму: <form action=task.php>
<table border=1>
<tr><td>Название </td><td><input type=text
name=title size=5> </td></tr>
<tr><td>Краткое содержание </td><td><input
type=text name=description size=5>
</td></tr>
<tr><td>Автор </td><td><input type=text
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>
Пример 7.8a. Форма для
примера 7.8Будем упорядочивать данные, переданные этой формой, по убыванию их значений, сохраняя при этом значения ключей. Для этого удобно воспользоваться функцией 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>";
// выводим элементы нового массива
?>
Пример 7.8b. Программа
обработки формы из примера 7.8Сортировка массива по ключамОчевидно, что может возникнуть необходимость в сортировке массива по значениям ключей. Например, если у нас есть массив данных о книгах, как в приведенном выше примере, то вполне вероятно, что мы захотим отсортировать книги по именам авторов. Для этого в PHP также не нужно писать много строк кода – можно просто воспользоваться функцией ksort() для сортировки по возрастанию (прямой порядок сортировки) или krsort() – для сортировки по убыванию (обратный порядок сортировки). Синтаксис этих функций опять же аналогичен синтаксису функции sort(). <?php
$books = array("Пушкин"=>"Руслан и Людмила",
"Толстой"=>"Война и мир",
"Лермонтов"=>"Герой нашего времени");
ksort($books);
// сортируем массив,
// сохраняя значения ключей
print_r($books);
?>
Пример 7.9. Сортировка массива
по ключамПолучим: 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));
/* можно, конечно переписать этот массив
по-другому, сделав год издания, например,
индексом, но гораздо удобнее написать свою
функцию для сортировки */
uasort($books,"cmp");
// сортируем массив с помощью функции cmp
foreach ($books as $key => $book) {
echo "$book[0]: \"$key\"<br>";
}
function cmp($a,$b){
// функция, определяющая способ сортировки
if ($a[1] < $b[1]) return -1;
elseif ($a[1]==$b[1]) return 0;
else return 1;
}
?>
Пример 7.10. Сортировка с
помощью пользовательских функцийВ результате получим: Пушкин: "Руслан и Людмила"
Лермонтов: "Герой нашего времени"
Толстой: "Война и мир"
Достоевский: "Идиот"
Мы применили нашу собственную функцию сортировки ко всем элементам массива. Далее рассмотрим, как применить к элементам массива любую другую пользовательскую функцию.
Зверніть увагу на додаткові посиланняЯкщо вас цікавить...Головний розділСторінки, близькі за змістомзагрузка...
|
Теми розділу
Сторінки, близькі за змістом
|
|
Copyright © 2008—2026 Портал Знань.
При використанні матеріалів посилання, для інтернет-ресурсів — гіперпосилання, на Znannya.org обов'язкове.
Зв'язок
|
НТУУ "КПІ" Інженерія програмного забезпечення КПІ Лабораторія СЕТ |
|