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

May 4, 2010 by admin Комментировать »

Сортировкой массива называется расстановка его элементов в определенном по­рядке. Для того чтобы вывести элементы массива на экран, скажем, в алфавитном порядке, первоначально необходимо этот массив отсортировать.

В РНР существует довольно большое количество функций для сортировки мас­сивов в том или ином порядке. К тому же, разработчик имеет возможность не толь­ко использовать стандартные методы сортировки, но и разработать и реализовать свои собственные.

Функция Sort О

Функция sort () является самой простейшей и используется для сортировки элементов от меньшего к большему. Формат записи функции следующий.

bool sort ( array Ьаггау [, int sort_flags] )

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

Необязательный параметр sort_f lags позволяет устанавливать опции сорти­ровки, приведенные в табл. 16.1.

Не рекомендуется сортировать массивы, используя функцию sort (), в которых элементы имеют разный тип (например, целые числа и строки).

Таблица 16.1. Опции сортировки функции sort()

Опция

Описание

SORT_REGULAR

Сравнивать элементы массива, не меняя их типов Сравнивать элементы как числа Сравнивать элементы как строки

Сравнивать элементы, основываясь на текущей локали

SGRT_NUMERIC

SORT_STRING

SORT_LOCALE_STRING

Рассмотрим пример использования данной функции. <?php

$аг = array("Олег","Николай","Мария"); sort($аг);

foreach($аг as $кеу => $value) {

echo $кеу . " " . $value . "<br>";

)

?>

В результате на экране должен появиться подобный текст.

0 Мария

1 Николай

2 Олег

Как видно из примера, каждый элемент массива не сохранил за собой свой на­чальный порядковый номер (ключ).

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

bool asort ( array barray [. int sort_flags] »

Необязательный параметр sort_flags может принимать одно из значений, приведенных в табл. 16.1.

Рассмотрим пример работы данной функции.

<?php

$аг = array("Олег","Николай","Мария"),

asort($аг);

foreach($аг as $кеу => $value) {

echo $кеу . " " . $value . "<br>";

}

?>

Результаты работы данного кода будут такими

2 Мария 1 Николай О Олег

Сортировка была проведена, но элементы сохранили свои ключи. 244 Глава 16

Функция AsortQ

функция RsortQ

Функция rsort () выполняет обычную сортировку массива, но в порядке убы­вания — от большего к меньшему. Этот порядок противоположен порядку сорти­ровки функции sort (). Формат записи функции rsort () следующий.

bool rsort ( array Ьаггау [, int sort_flags] )

Пример работы данной функции.

<?php

$аг = array("Антон","Николай","Мария");

rsort($аг);

foreach($аг as $кеу => $value) {

echo $кеу . " " . $value . "<Ьг>"д

)

?>

Такой код выведет на экран следующий текст.

0 Николай

1 Мария

2 Антон

При использовании rsort () все элементы массива теряют свои первоначальные ключи и приобретают новые, соответствующие их новому порядковому номеру.

Функция ArsortQ

Данная функция отличается от rsort () лишь тем, что при ее использовании элементы сортируемого массива сохраняют за собой свои ключи. Записывается функция следующим образом.

bool arsort ( array Ьаггау [, int sort_flags’] )

Применяется она как и все предыдущие.

<?php

$аг = array("Антон","Николай","Мария");

arsort($аг);

foreach($аг as $кеу => $value) {

echo $кеу . " " . $value . "<br>";

}

?>

Данный код выведет на экран следующий текст.

1 Николай

2 Мария О Антон

Как видно из примера, все элементы массива сохранили свои ключи и после сор­тировки.

i

функция KsortQ

Если все описанные выше функции сортировали элементы массива, то функция ksort () сортирует массив по его ключам. Формат записи функции следующий.

bool ksort ( array Ьаггау [, int sort_flags] )

Функция сортирует массив в порядке возрастания. Рассмотрим пример. <?php

$аг = array(

"Имя" => "Антон",

"Должность’ => "Программист",

"Возраст" => 24

) ;

ksort($аг);

foreach($аг as Skey => $value) {

echo $key . ": " . $value . "<br>";

)

?>

Код выведет на экран следующий текст. Возраст: 24

Должность: Протраммист Имя: Антон

Функция отсортировала массив по его ключам в алфавитном порядке.

Функция KrsortQ

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

bool krsort ( array Ьаггау [, int sort_flags] i

Пример использования.

<?php

$ar = array(

"Имя" => "Антон", "Должность" => "Программист" ‘Возраст" => 24

);

krsort (Sar) ;

foreach($ar as $key => $value) i

echo $key . ": " . Svalue . "<br>";

}

?>

В результате выполнения кода на экране должен появиться следующий текст. Имя: Антон

Должность: Программист Возраст: 24

Функции ksort () и krsort () применяются в основном для сортировки ассо­циативных массивов.

функция NatsortO

Многие из тех, кто работал в операционной среде Windows, замечали, что в не­которых случаях файлы сортируются по именам "не совсем правильно". Если в наименовании файлов присутствуют числа (например, filel0.txt или 10.doc), то их сортировка становится немного нелогичной. Например, вот так может вы­глядеть список файлов.

docl.doc docl0.doc doc2.doc

В таком же порядке происходит сортировка с помощью функции sort (), что не всегда может устраивать разработчика.

Чтобы поправить ситуацию, можно использовать функцию с естественным (натуральным) алгоритмом сортировки natsort (). Формат записи функции сле­дующий.

bool natsort ( array &array )

Пример использования.

<?php

$ar = array("docl.doc","doc2.doc","doclO.doc"); natsort($ar);

foreach($ar as $key => $value) {

echo Skey . ": " . Svalue . "<br>";

}

?>

Ha экране появится текст.

О: docl.doc 1: doc2.doc 2: docl0.doc

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

Функция UsortQ

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

booj usort ( array Sarray. callback cn^_function )

В качестве параметра &array передается имя массива, который нужно отсорти­ровать, а в качестве параметра cmp_function передается имя функции, которая ответственна за сортировку.

При написании собственной функции для сравнения элементов массива необхо­димо придерживаться некоторых правил. Собственная функция должна возвра­щать одно из значений:

• 1 — если один элемент "больше" другого;

• 1 — если элемент "меньше";

• О — если сравниваемые элементы равны.

В принципе допустимы любые значения меньше, нуля, ноль и любое число больше нуля, но мы рекомендуем использовать -1, О и 1.

Рассмотрим пример. Допустим, существует необходимость отсортировать мас­сив, в котором хранятся русские названия дней недели. В РНР нет стандартной функции для такой сортировки. Если учесть, что дни недели это не даты, а просто набор строк, попробуем написать свою функцию.

<?php

//исходный массив

$а array("Понедельник","Пятница","Среда", "Четверг","Среда"):

//для сортировки используется собственная функция // weekday_rus_sort() (описана ниже) usort($а, "weekday_rus_sort");

//перебор результирующего массива

foreach($а as $кеу => $value) {

echo $кеу . ": " . $value . "<br>";

}

//собственно сана функция сравнения

function weekday_rus_sort($a, $b) {

//определяем, как дни должны идти на самом деле

$weekdays_rus = array(

1 => "Понедельник"

2 => "Вторник",

3 => "Среда’,

4 => "Четверг",

5 => "Пятница",

6 => "Суббота ‘,

7 => "Воскресенье"

) ;

//в этих переменных будут храниться ключи //сравниваемых элементов из массива $weekdays_rus

$а_кеу = 0;

$Ь_кеу = 0;

//выясняем ключи сравниваемых элементов $а и $Ь //это можно сделать и с помощью функции array_search() foreach ($weekdays_rus as $key => $value) { if ($a == $value) { $a_key = $key;

)

if ($b == $value) { $b_key = $key;

)

)

//выполняем обязательные сравнения

if ($а_кеу == $Ь_кеу) { return 0;

)

elseif ($а_кеу < $b_key) { return -1;

}

else {

return 1;

}

)

?>

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

О: Понедельник 1: Среда 2: Среда 3: Четверг 4: Пятница

Реализованная для сравнения функция weekday_rus_sort () основывается на сравнении ключей элементов массива $weekdays_rus, в котором все дни недели указаны в правильном порядке.

Оставить комментарий

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