ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Сортировка массивов. Сортировка многомерных массивов

Сортировка массивов

Сортировка связанных данных в массиве бывает исключительно полезна, в то время как сортировка одномерного массива достаточно проста.

Использование функции sort ()

Указанный ниже код, в котором используется функция sort (), упорядочивает массив в алфавитном порядке:

<?php
$products = array ('Фильтр масляный','Фильтр воздушный','Свечи зажигания');
sort ($products);
foreach ($products as $product)
echo "$product<br>";
?>

Теперь элементы будут расположены в алфавитном порядке.

В окне веб-браузера это будет выглядеть ТАК.

Значения можно упорядочит также и в цифровом порядке. При наличии массива, содержащего цены на товары, поставляемой компанией АВС, его можно отсортировать в порядке возростания цифровых значений:

<?php
$prices = array (20, 10, 4);
sort ($prices);
foreach ($prices as $prices)
echo "$prices<br>";
?>

Теперь цены будут следовать в порядке возрастания.

В окне веб-браузера это будет выглядеть ТАК.

Обратите внимание на то, что функция sort () чувствительна к регистру, т.е. прописные буквы предшествуют строчным.

Кроме того, функция sort () может принимать необязательный второй параметр, который может быть равен одной из следующих констант:

SORT_REGULAR (по умолчанию)

SORT_NUMERIC

SORT_STRING

Возможность указания типа сортировки полезна, когда выполняется сравнение строк.

Использование функций asort () и ksort () для сортировки массивов

Если для хранения информации о товарах и ценах используется массив с описательными индексами, нужно применять другие функции сортировки, обеспечивающие совместное созранение ключей и значений во время сортировки.

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

<?php
$prices = array ('Фильтр масляный'=> 20,'Фильтр воздушный' => 10,'Свечи зажигания' =>4);
asort ($prices);
while (list ($product, $price) = each ($prices) )
echo "$product - $price <br>";
?>

В окне веб-браузера это будет выглядеть ТАК.

Функция asort () упорядочивает массив в соответствии со значениями элементов. В данном массиве значениями являются цены, а в качестве ключей выбраны текстовые описания товара. Если сортировку требуется выполнить не ценам а по описаниям, следует воспользоваться функцией ksort (), которая выполняет сортировку не позначениям, а по ключам. Показанный код приведет к упорядочению ключей массива в алфавитном порядке:

<?php
$prices = array ('OLL_M'=> 20,'Air' => 10,'Spark Plugs' =>4);
ksort ($prices);
while (list ($product, $price) = each ($prices) )
echo "$product - $price <br>";
?>

В окне веб-браузера это будет выглядеть ТАК.

Cортировка в обратном порядке

Все рассмотренные нами функции выполняют сортировку массива в порядке возрастания. Каждая из них имеет соответствующую ей функцию, которая выполняет сортировку массива в порядке убывания. Обратными функциями являются, соответственно, rsort (), arsort (), krsort ().

Функции обратной сортировки используются также, как функции обычной сортировки. Функция rsort () выполняет сортировку одномерного численно-индексированного массива в порядке убывания. Функция arsort () выполняет сортировку одномерного массива с описательными индексами в порядке убывания значений элементов. Функция krsort () выполняет сортировку одномерного массива с описательными индексами в порядке убывания кшлючей элементов.

Сортировка многомерных массивов

Сортировка массивов, имеющих более одного измерения, или в порядке, отличающемся от алфавитного, более сложна. В РНР имеется возможность сравнения двух чисел или двух текстовых строк, но следует помнить, что в многомерном массиве каждый элемент является массивом. В РНР отсутствует возможность сравнения двух массивов, поэтому для их сравнения необходимо создать некоторый метод. В большинстве случаев порядок слов и номеров очевиден, но в случае сложных объектов выполнение сортировки становится проблематичным.

Определяемые функции сортировки

Вернемся к двумерному массиву ранее используемого нами, в котором храняться коды товаров трех видов, их названия и цены.

$products = array (array ('OLL', 'Фильтры масляные', 20),
array ('AIR', 'Фильтры воздушные', 10),
array ('SPK', 'Свечи зажигания', 4));

Товары данного массива можно упорядочить в алфавитном порядке по описаниям или в цифровом порядке по ценам. Для этого воспользуемся функцией usort () и укажем РНР, как следует сравнивать элементы. Для этого создадим собственную функцию сравнения.

<?php

$products = array (array ('OLL', 'Фильтры масляные', 20),
array ('AIR', 'Фильтры воздушные', 10),
array ('SPK', 'Свечи зажигания', 4));

function compare ($x, $y)
{
if ($x[1] == $y[1])
return 0;
else if ($x[1] < $y [1])
return -1;
else
return 1;
}
usort ($products, 'compare');

for ($row = 0; $row < 3; $row ++)
{
for ($column = 0; $column < 3; $column ++)
{
echo '|' .$products[$row][$column];
}
echo '| <br>';
}
?>

В окне веб-браузера это будет выглядеть ТАК.

В нашем примере, функция определяется с помощью ключевого слова function. Функции необходимо присвоить имя. Имена должны нести смысловую нагрузку, поэтому и название функции compare (). Многие функции принимают параметры или аргументы. Наша функция принимает два аргумента: x и y. ЕЕ назначение заключается в том, принять два значения и определить их порядок

Применительно к рассматриваемому примеру, параметрами x и y будут два массива внутри основного массива, каждый из которых представляет один вид товара. Чтобы обратиться к элементу description массива x, необходимо ввести $x[1], поскольку description есть второй элемент в этом массиве, а нумерация начинается с нуля. Для сравнения элементов description из массивов, переданных в функцию, используются переменные $x[1] и $y[1].

Когда функция завершает работу, она может вернуть ответ в вызвавший ее код. Эта операция называется возвратом значения. Для возврата значения из функции служит ключевое слово return. Например, строка return 1; возвращает значение коду, вызвавшему эту функцию.

Чтобы функция compare () могла быть использована в usort (), она должна сравнить x и y. Функция compare () должна возвращать 0, если значение x равно значению y, отрицательное число, если значение x меньше значения y, и положительное — если значение x больше значения y. Наше функция будет возвращать значения 0, 1, -1 в зависимости от значений x и y. Заключительная строка кода вызывает встроенную функцию usort () с массивом, в котором нужно выполнить сортировку $products и именем функции сравнения compare ().

Если требуется, чтобы массив был отсортирован в другом порядке, можно прописать другую функцию сравнения. Для выполнения сортировки по ценамнеобходимо предусмотреть третий столбец массива и создать следующую функцию сравнения:

<?php

$products = array (array ('OLL', 'Фильтры масляные', 20),
array ('AIR', 'Фильтры воздушные', 10),
array ('SPK', 'Свечи зажигания', 4));

function compare ($x, $y)
{
if ($x[2] == $y[2])
return 0;
else if ($x[2] > $y [2])
return -1;
else
return 1;
}
usort ($products, 'compare');

for ($row = 0; $row < 3; $row ++)
{
for ($column = 0; $column < 3; $column ++)
{
echo '|' .$products[$row][$column];
}
echo '| <br>';
}
?>

В окне веб-браузера это будет выглядеть ТАК.

При вызове функции usort ($products, 'compare'); массив будет упорядочен в порядке убывания цен.

Версии uasotr () и uksort () функций asort () и ksort () также требуют применения определяемых пользователем функций сравнения.

Подобно функции asort (), функция uasort () используется при сортировке массива с описательными индексами по значениям. Функцияю asort () следует применять, если значения являются простыми числами или текстом. Если же значения представлены более сложными объектами, такими как массивы, следует определить функцию сравнения и использовать функцию uasort ().

Так же как и функция ksort (), функция uksort () должна использоваться при сортировке массива с описательными индексами по значениям. Функцию ksort () следует применять, когда значения являются простыми числами или текстом. Если же значения являются более сложными объектами наподобие массивов, следует определить функцию сравнения и воспользоваться функцией uksort ().

Функции сортировки в обратном порядке

Функции sort (), asort () и ksort () имеют соответствующие функции сортировки в обратном порядке. Их имена содержат символ "r". Определяемые пользователем функции сортировки не имеют обратных версий, тем не менее, можно выполнить обратную сортировку многомерных массивов. Поскольку выбор функции сравнения остается за вами, напишем функцию сравнения, возвращающую противоположные значения. Чтобы выполнить обратную сортировку, эта функция должна возвращать значение 1, если x меньше y, и -1, если x больше y. Например:

<?php
$products = array (array ('OLL', 'Фильтры масляные', 20),
array ('AIR', 'Фильтры воздушные', 10),
array ('SPK', 'Свечи зажигания', 4));

function compare ($x, $y)
{
if ($x[2] == $y[2])
return 0;
else if ($x[2] > $y [2])
return -1;
else
return 1;
}
usort ($products, 'compare');

for ($row = 0; $row < 3; $row ++)
{
for ($column = 0; $column < 3; $column ++)
{
echo '|' .$products[$row][$column];
}
echo '| <br>';
}
?>

В окне веб-браузера это будет выглядеть ТАК.

Теперь вызов функции usort ($products, 'reverseCompare'); приводит к тому, что элементы массива следуют в порядке убывания цен.