Сортировка данных в массиве php. Сортировка нескольких массивов

26.04.2019

Очевидно, что может возникнуть необходимость в сортировке массива по значениям ключей . Например, если у нас естьмассив данных о книгах, как в приведенном выше примере, то вполне вероятно, что мы захотимотсортировать книги по именам авторов. Для этого в PHP также не нужно писать много строк кода – можно просто воспользоваться функциейksort() длясортировки по возрастанию (прямой порядоксортировки ) илиkrsort() – длясортировки по убыванию (обратный порядоксортировки ). Синтаксис этих функций опять же аналогичен синтаксису функцииsort() .

$books = array("Пушкин"=>"Руслан и Людмила",

"Толстой"=>"Война и мир",

"Лермонтов"=>"Герой нашего времени");

// сортируем массив,

// сохраняя значения ключей

print_r($books);

Пример 7.9. Сортировка массива по ключам (html , txt )

Array ([Лермонтов] => Герой нашего времени

[Пушкин] => Руслан и Людмила

[Толстой] => Война и мир)

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

Кроме двух простых способов сортировки значений массива (по убыванию или по возрастанию) PHP предлагает пользователю возможность самому задавать критерии длясортировки данных. Критерий задается с помощью функции, имя которой указывается в качестве аргумента для специальных функцийсортировки usort() илиuksort() . По названиям этих функций можно догадаться, чтоusort() сортирует значения элементовмассива , аuksort() значения ключей массива с помощью определенной пользователем функции. Обе функции возвращаютtrue, еслисортировка прошла успешно, иfalse– в противном случае. Их синтаксис выглядит следующим образом:

usort (массив, сортирующая функция)

uksort (массив, сортирующая функция)

Конечно же, нельзя сортировать массив с помощью любой пользовательской функции. Эта функция должна удовлетворять определенным критериям, позволяющим сравнивать элементымассива . Как должна быть устроена сортирующая функция? Во-первых, она должна иметь два аргумента. В них интерпретатор будет передавать парызначений элементов для функцииusort() илиключей массива для функцииuksort() . Во-вторых, сортирующая функция должна возвращать:

    целое число, меньшее нуля, если первый аргумент меньше второго;

    число, равное нулю, если два аргумента равны;

    число большее нуля, если первый аргумент больше второго.

Как и для других функций сортировки , для функцииusort() существует аналог, не изменяющийзначения ключей , – функцияuasort() .

Пример 7.10. Допустим, у нас естьмассив , содержащий такие сведения о литературных произведениях, как название, автор и год создания. Мы хотим упорядочить книги по дате создания.

// массив выглядит таким образом:

$books = array("Герой нашего времени" =>

array ("Лермонтов", 1840),

"Руслан и Людмила" => array("Пушкин",1820),

"Война и мир" => array ("Толстой",1863),

"Идиот" => array("Достоевский",1868));

/* можно, конечно переписать этот массив

по-другому, сделав год издания, например,

индексом, но гораздо удобнее написать свою

функцию для сортировки */

uasort($books,"cmp");

// сортируем массив с помощью функции cmp

foreach ($books as $key => $book) {

echo "$book: \"$key\"
";

function cmp($a,$b){

// функция, определяющая способ сортировки

if ($a < $b) return -1;

elseif ($a==$b) return 0;

Пример 7.10. Сортировка с помощью пользовательских функций (html , txt )

В результате получим:

Пушкин: "Руслан и Людмила"

Лермонтов: "Герой нашего времени"

Толстой: "Война и мир"

Достоевский: "Идиот"

Мы применили нашу собственную функцию сортировки ко всем элементаммассива . Далее рассмотрим, какприменить к элементам массива любую другую пользовательскую функцию .

Применение функции ко всем элементам массива

Функция array_walk(массив, функция [, данные]) применяет созданную пользователем функцию функция ко всем элементам массива массив и возвращает true в случае успешного выполнения операции и false – в противном случае.

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

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

$books1 = array(

"А.С. Пушкин"=>"Руслан и Людмила",

"Л.Н. Толстой"=>"Война и мир",

"М.Ю. Лермонтов"=>"Герой нашего времени");

function try_walk($val,$key,$data){

echo "$data \"$val\" написал $key
";

// $book1 функцию try_walk

array_walk($books1,"try_walk","Роман");

Пример 7.11. Применение функции ко всем элементам массива (html , txt )

Роман "Руслан и Людмила" написал А.С. Пушкин

Роман "Война и мир" написал Л.Н. Толстой

Роман "Герой нашего времени"

написал М.Ю. Лермонтов

Заметим, что мы не изменили значений у элементов массива . Чтобы их изменить, надо было передавать значения в переменную $var функции try_walk по ссылке.

$books1 = array(

"А.С. Пушкин"=>"Руслан и Людмила",

"Л.Н. Толстой"=>"Война и мир",

"М.Ю. Лермонтов"=>"Герой нашего времени");

// создаем функцию, которую хотим

// применить к элементам массива

function try_walk(&$val,$key){

$key = "

$val = "Название: \"" . $val ."\"

";

// применяем ко всем элементам массива

// $book1 функцию try_walk

array_walk($books1,"try_walk");

print_r($books1);

Пример 7.12. Применение функции ко всем элементам массива. Вариант 2 (html , txt )

В результате работы скрипта получим:

Название: "Руслан и Людмила"

Название: "Война и мир"

Название: "Герой нашего времени"

Array ([А.С. Пушкин] =>

Название: "Руслан и Людмила"

[Л.Н. Толстой] =>

Название: "Война и мир"

[М.Ю. Лермонтов] =>

Название: "Герой нашего времени")

Выделение подмассива

Функция array_slice

Поскольку массив – это набор элементов, вполне вероятно, потребуется выделить из него какой-нибудь поднабор. В PHP для этих целей есть функцияarray_slice . Ее синтаксис таков:

array_slice (массив,

номер_элемента [, длина])

Эта функция выделяет подмассив длиныдлинавмассиве массив, начиная с элемента, номер которого задан параметромномер_элемента. Положительныйномер_элементауказывает на порядковый номер элемента относительно началамассива , отрицательный – на номер элемента с концамассива .

$arr = array(1,2,3,4,5);

$sub_arr = array_slice($arr,2);

print_r($sub_arr);

выведет Array ( => 3 =>4 => 5),

т.е. подмассив, состоящий из элементов

$sub_arr = array_slice($arr,-2);

print_r($sub_arr);

// выведет Array ( => 4 => 5),

// т.е. подмассив, из элементов 4, 5

Пример 7.13. Использование функции array_slice() (html , txt )

Если задать параметр длинапри использованииarray_slice , то будетвыделен подмассив , имеющий ровно столько элементов, сколько задано этим параметром. Длину можно указывать и отрицательную. В этом случае интерпретатор удалит с концамассива число элементов, равное модулю параметрадлина.

$arr = array(1,2,3,4,5);

$sub_arr = array_slice($arr, 2, 2);

// содержит массив из элементов 3, 4

$sub = array_slice($arr,-3, 2);

// тоже содержит массив из элементов 3, 4

$sub1 = array_slice($arr,0, -1);

// содержит массив из

// элементов 1, 2, 3, 4

$sub2 = array_slice($arr,-4, -2);

// содержит массив из элементов 2, 3

Пример 7.14. Использование функции array_slice(). Вариант 2 (html , txt )

Функция array_chunk

Есть еще одна функция, похожая на array_slice() – этоarray_chunk() . Она разбиваетмассив на несколько подмассивов заданной длины. Синтаксис ее такой:

array_chunk (массив, размер

[, сохранять_ключи])

В результате работы array_chunk() возвращает многомерныймассив , элементы которого представляют собой полученные подмассивы. Если задать параметр сохранятьключи какtrue, то при разбиении будут сохраненыключи исходногомассива . В противном случаеключи элементов заменяются числовыми индексами, которые начинаются с нуля.

Пример 7.15. У нас есть список приглашенных, оформленный в видемассива их фамилий. У нас имеются столики на три персоны. Поэтому нужно распределить всех приглашенных по трое.

$persons = array("Иванов", "Петров",

"Сидорова","Зайцева", "Волкова");

$triples = array_chunk($persons,3);

// делим массив на подмассивы

// по три элемента

foreach ($triples as $k => $table){

// выводим полученные тройки

echo "За столиком номер $k сидят:

    ";

    foreach ($table as $pers)

    echo "

  • $pers";

    echo "

";

Пример 7.15. Использование функции array_chunk() (html , txt )

В результате получим:

за столиком номер 0 сидят:

Сидорова

за столиком номер 1 сидят:

Зайцева

Волкова

Сумма элементов массива

В этом разделе мы познакомимся с функцией, вычисляющей сумму всех элементов массива . Сама задача вычислениясуммы значений массива предельно проста. Но зачем писать лишний раз один и тот же код, если можно воспользоваться специально созданной и всегда доступной функцией. Функция эта называется, как можно догадаться,array_sum() . И в качестве параметра ей передается только имямассива ,сумму значений элементов которого нужно вычислить.

В качестве примера использования этой функции приведем решение более сложной задачи, чем просто вычисление суммы элементов . Этот пример также иллюстрирует применение функцииarray_slice() , которую мы обсуждали чуть раньше.

Пример 7.16. Пусть данмассив натуральных чисел. Нужно найти в нем такое число, чтосумма элементов справа от него равнасумме элементов слева от него.

//массив задается функцией array

$arr = array(2,1,3,4,5,6,4);

// перебираем каждый элемент массива $arr.

// Внутри цикла текущий ключ массива

// содержится в переменной $k,

// текущее значение – в переменной $v

foreach ($arr as $k => $val){

// синтаксис array array_slice (

array array,int offset [,int length])

// array_slice выделяет подмассив

// длины length в массиве array,

// начиная с элемента offset.

$out_next = array_slice($arr,$p);

// идущих после текущего

$out_prev = array_slice($arr,0,$k);

// получаем массив элементов,

// идущих перед текущим

// функция mixed array_sum (array array)

// подсчитывает сумму элементов массива array

$next_sum = array_sum($out_next);

$prev_sum = array_sum($out_prev);

// если сумма элементов до текущего равна

// сумме элементов после, то выводим

// значение текущего элемента

if ($next_sum==$prev_sum)

echo "value:$val";

// можно посмотреть, что представляют собой

// рассмотренные массивы на каждом шаге

// print_r($out_next); echo "
";

// print_r($out_prev);

// echo "$next_sum, $prev_sum
";

echo "


";

Пример 7.16. Программа поиска числа, такого что сумма элементов справа от него равна сумме элементов слева от него (html , txt )

Заключение

Итак, подведем итоги. В этой лекции мы изучили ряд функций, упрощающих работу с массивами данных. Мы рассмотрели функции дляпоиска значения среди элементов массива ; функции длясортировки элементов массива , как по ихзначениям , так и поключам ; функции, позволяющиеприменять ко всем элементам массива функцию, созданную пользователем . Кроме того, мы изучили функцию,выделяющую подмассивы из элементовмассива , и функцию, вычисляющуюсумму всех элементов массива . Использование всех этих функций было продемонстрировано на примерах. Все функции для работы смассивами доступны без каких-либо конфигурационных настроек PHP, и пользоваться ими можно абсолютно свободно. Так что, прежде чем изобретать велосипед, загляните в руководство по языку PHP: – вполне возможно, что кто-то сделал это до вас.

Последнее обновление: 1.11.2015

Функция is_array

Функция is_array() проверяет, является ли переменная массивом, и если является, то возвращает true , иначе возвращает false . Например:

$isar = is_array($technics); echo ($isar==true)?"это массив":"это не массив";

Функции count/sizeof

Функция count() и sizeof() получают количество элементов массива:

$number = count($technics); // то же самое, что // $number = sizeof($technics); echo "В массиве technics $number элементов";

Функции shuffle

Функция shuffle перемешивает элементы массивы случайным образом:

$os = array("Windows 95", "Windows XP", "Windows Vista", "Windows 7", "Windows 8", "Windows 10"); shuffle($os); print_r($os); // один из возможных вариантов // Array ( => Windows 95 => Windows 7 => Windows Vista => Windows XP => Windows 10 => Windows 8)

Функции compact

Функция compact позволяет создать из набора переменных ассоциативный массив, где ключами будут сами имена переменных:

Apple II => Apple => 1978) ?>

Функция compact получает в скобках набор переменных. Каждая переменная указывается в кавычка без знака $. Результатом функции является новый массив.

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

В PHP имеются два типа сортировки: сортировка строк по алфавиту и сортировка чисел по возрастанию/убыванию. Если сортируемые значения представляют строки, то они сортируются по алфавиту, если числа - то они сортируются в порядке возрастания чисел. PHP по умолчанию самостоятельно выбирает тип сортировки.

Для сортировки по возрастанию используется функция asort :

"Lenovo IdeaTab A3500", "samsung" => "Samsung Galaxy Tab 4", "apple" => "Apple iPad Air"); asort($tablets); echo "

    "; foreach ($tablets as $key => $value) { echo "
  • $key: $value
  • "; } echo "
"; ?>

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

    SORT_REGULAR: автоматический выбор сортировки

    SORT_NUMERIC: числовая сортировка

    SORT_STRING: сортировка по алфавиту

Укажем явно тип сортировки:

Asort($tablets, SORT_STRING);

Чтобы отсортировать массив в обратном порядке, применяется функция arsort :

Arsort($tablets);

Сортировка по ключам

Функция asort производит сортировку по значениям элементов, но также существует и еще и сортировка по ключам. Она представлена функцией ksort :

Ksort($tablets, SORT_STRING);

Сортировка по ключам в обратном порядке выполняется функцией krsort() :

Krsort($tablets);

Естественная сортировка

Хотя выше описанные функции сортировки прекрасно выполняют свою работу, но их возможностей все-таки недостаточно. Например, отсортируем по возрастанию следующий массив:

Windows 10 => Windows 7 => Windows 8) ?>

Так как значения представляют строки, то PHP сортирует по алфавиту. Однако подобная сортировка не учитывает числа и регистр. Поэтому значение "Windows 10" будет идти в самом начале, а не в конце, как должно было быть. И для решения этой проблемы в PHP есть функция natsort() , которая выполняет естественную сортировку:

Windows 7 => Windows 8 => Windows 10) ?>

Если нам надо еще при этом, чтобы сортировка не учитывала регистр, то мы можем применить функцию natcasesort() .

При работе на многих сайтах часто встречается вопрос сортировки данных массива в алфавитном порядке. Многие для этого пишут дополнительные массивы, сравнивают крупные таблицы и перебирают каждое название... Этот вариант не самый лучший, хотя его мы тоже рассмотрим. В данной статье я бы хотел предложить самый простой и короткий путь, который при внимательном прочтении мануалов можно найти в документации.

Массив в алфавитном порядке PHP

Способ достаточно прост и заключается в двух шагах: установке локали (setlocal) и непосредственно сортировки массива. Рассмотрим пример с комментариями.

Код PHP

setlocale(LC_ALL, "Russian_Russia.1251"); // установили локаль для русских букв

// пример массива, где слова расположены НЕ по порядку
$example=array("банка","Борис","вид","анкета","егерь","Фёдор","жена","голос");

Natcasesort($example, SORT_LOCALE_STRING); // сортируем массив БЕЗ учёта регистра
// ДЛЯ УЧЁТА РЕГИСТРА используйте sort вместо natcasesort

// выводим результат
foreach ($example as $key => $value){
echo "$value "; // отобразим только слова, без индекса
}
?>

Демонстрация Скачать исходники
В демонстрации можете посмотреть работу скрипта. При желании можете также скачать архив с файлом.

Если у Вас сервер не на Windows, то нужно будет установить другие локали или сразу несколько:

(LC_ALL, "ru_RU.CP1251", "rus_RUS.CP1251", "Russian_Russia.1251");
// Выведет ru_RU.CP1251 для FreeBSD
// Выведет rus_RUS.CP1251 для линукса
// Выведет Russian_Russia.1251 для Windows

Опережу ответом один из вопросов - локаль для Украины в PHP выглядит так:


Как установить локаль для других кодировок в PHP?

// Устновка локалей для Windows

// Кодировка Windows-1251
setlocale(LC_ALL, "Russian_Russia.1251");

// Кодировка KOI8-R
setlocale(LC_ALL, "Russian_Russia.20866");

// Кодировка UTF-8 (использовать осторожно)
setlocale(LC_ALL, "Russian_Russia.65001");
?>

Второй способ выстроить массив в алфавитном порядке PHP

Если данный способ не устроит и Вы хотите пойти сложным путём, то создайте массив следующего вида:

Код PHP

=> а
=> б
=> в
=> г
=> д
=> е
=> ё
=> ж
=> з
=> и
=> й
=> к
=> л
=> м
=> н
=> о
=> п
=> р
=> с
=> т
=> у
=> ф
=> х
=> ц
=> ч
=> ш
=> щ
=> ъ
=> ы
=> ь
=> э
=> ю
=> я
И переберите по первой букве второй массив.
Первую букву какого-либо элемента массива вычисляем так:

Код PHP

$city="Москва"; // например элемент с индексом 1

$first_letter = mb_substr($city,0,1,"UTF-8"); // получим букву "М"
Поскольку работаем с русскими буквами (многобайтной кодировкой), то использовать лучше функцию mb_substr , а в конце лучше точно указать кодировку данных переменной или массива, в нашем случае UTF-8.

Спасибо за внимание! Надеюсь информация была полезна. Если есть вопросы, то пишите в комментариях.

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

Итак, сортировка упрощает работу с массивами. Когда элементы отсортированы, то их проще найти и произвести с ними необходимые действия, например, те, о которых я написала чуть выше. Все зависит от задачи, которая перед Вами стоит.

Задачи могут быть различными, но инструменты, которые мы при этом будем использовать останутся стандартными. Эти инструменты – специальные функции, которые и применяются для сортировки элементов массива.

Функций этих в php несколько, и какую из них применить, опять же будет зависеть от конкретной задачи, а также от того, является ли Ваш массив ассоциативным или массивом-списком.

Давайте на примерах разберем эти функции и посмотрим, как они работают.

Сортируем массивы-списки в алфавитном и обратном порядке

Для начала давайте познакомимся с достаточно простой и понятной функцией sort() .

Она позволит нам отсортировать элементы массива по возрастанию или, если эти элементы строковые – в алфавитном порядке.

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

$Mass = array("Катя", "Аня", "Лена","Андрей"); sort($Mass); print_r($Mass); ?>

А результат будет следующим. Как Вы можете видеть на скриншоте справа, элементы отсортированы в алфавитном порядке. Если вместо строковых элементов у нас будут числа, то эта функция также отсортирует числа по возрастанию. Можете проверить это самостоятельно.

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

Эта функция называется rsort() . Работает она следующим образом:

$Mass = array("Катя", "Аня", "Лена","Андрей"); rsort($Mass); print_r($Mass); ?>

Как Вы можете видеть, теперь результат полностью противоположный. Элементы массива отсортированы по убыванию, что в данном случае обозначает в порядке обратном алфавитному.

Думаю, что с этими функциями все предельно ясно. Протестируйте их со своими массивами и у Вас не останется никаких вопросов.

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

Все замечательно, однако, с ассоциативными массивами мы уже не сможем применить данные функции, так как они разрывают связь значения с ключом массива. Поэтому нам нужно познакомиться еще с некоторыми функциями, которые позволят нам сортировать ассоциативные массивы.

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

Давайте начнем с сортировки по значениям.

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

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

$Mass["один"]="Катя"; $Mass["два"]="Борис"; $Mass["три"]="Аня"; $Mass["четыре"]="Рита"; asort($Mass); print_r($Mass); ?>

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

Таким же образом работает, и функция arsort() , за тем исключением, что она сортирует значения ассоциативного массива в обратном порядке.

$Mass["один"]="Катя"; $Mass["два"]="Борис"; $Mass["три"]="Аня"; $Mass["четыре"]="Рита"; arsort($Mass); print_r($Mass); ?>

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

Тот же самый ассоциативный массив мы можем отсортировать и по ключам.

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

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

$Mass["один"]="Катя"; $Mass["два"]="Борис"; $Mass["три"]="Аня"; $Mass["четыре"]="Рита"; ksort($Mass); print_r($Mass); ?>

Массив отсортирован по ключам в алфавитном порядке.

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

$Mass["один"]="Катя"; $Mass["два"]="Борис"; $Mass["три"]="Аня"; $Mass["четыре"]="Рита"; krsort($Mass); print_r($Mass); ?>

Думаю, что из скриншота все понятно.

Пользовательская сортировка

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

Для этого также в php предусмотрены специальные функции.

Для пользовательской сортировки списков предусмотрена функция usort() .

Она будет принимать два аргумента. Первый аргумент – это наш массив; второй аргумент – будет содержать имя функции, сравнивающей два элемента.

Функция сравнения будет принимать две переменные и должна возвращать одно из значений:

1 – если первый элемент сравнения больше второго;

-1 – если второй больше первого;

0 – если элементы равны.

Таким образом мы, например, можем отсортировать элементы массива по возрастанию их длины.

Для этого сначала объявим сам массив, который будет содержать строковые элементы различной длины.

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

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

$Mass = array("Андрей", "Яна", "Катя"); function check_length($str1,$str2){ $length1 = strlen($str1); $length2 = strlen($str2); if($length1 == $length2): return 0; elseif($length1

Получим мы следующий результат. Элементы нашего массива отсортированы в порядке увеличения их длины.

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

Давайте оставим пользовательскую функцию той же, то есть сравниваем длину ключей.

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

И также мы можем создать пользовательскую сортировку ассоциативного массива по значениям его элементов. В этом нам поможет функция uasort() .

Принцип все тот же.

$Mass["один"]="яна"; $Mass["два"]="андрей"; $Mass["три"]="катя"; function check_length($str1,$str2){ $length1 = strlen($str1); $length2 = strlen($str2); if($length1 == $length2): return 0; elseif($length1

Теперь массив отсортирован по увеличению длин его значений.

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

Чтобы хорошенько понять, как работает пользовательская сортировка, нужно попрактиковаться и попробовать написать какую-то свою функцию сравнения.

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

Практикуйтесь, пишите Ваши комментарии и делитесь статьей с друзьями при помощи кнопок социальных сетей.

Если Вы еще не подписаны на обновления блога, то подписывайтесь. Форма подписки находится ниже.

С Вами была Анна Котельникова. До встречи в следующих статьях.

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

Составляющие :

  • Многомерный массив;
  • Встроенные функции PHP usort () , uasort () или uksort () ;
  • Встроенные функции PHP strcasecmp() или strcmp() .

Реализация :
Допустим что, у нас есть массив:

$students = array (1 => array ("name" => "Jack", "grade" => 98.5), 2 => array ("name" => "Bill", "grade" => 90.1), 3 => array ("name" => "Chloe", "grade" => 94.0), 4 => array ("name" => "Taylor", "grade" => 95.1), 5 => array ("name" => "Larry", "grade" => 94.6));

Здесь можно осуществить сортировку двумерного массива PHP по параметру grade (оценка ) (числовая сортировка ) или name (имя ) (сортировка в алфавитном порядке ).

Внешний массив $students состоит из пяти элементов, каждый из которых также представлен в виде отдельного массива. Внутренний массив использует ID студента в качестве ключа и хранит два значения: имя студента и его оценку.

Для сортировки многомерного массива мы задаем собственную функцию. Говорим PHP , что именно ее нужно использовать для вызова встроенных функций usort () , uasort () или uksort () .

Определяемая функция должна принимать два параметра и возвращать значение, указывающее, какой именно параметр идет первым по списку. Отрицательное или false значение говорит о том, что первый параметр указывается до второго. Положительное или true — что вначале идет второй параметр. Нулевое значение (0 ) указывает, что оба параметра равнозначны.

A – Сортировка по оценке (параметр grade) (числовая сортировка)

Определим функцию для сортировки массива по оценке (параметр grade ):

// Функция сортировки по оценке: сортировка по УБЫВАНИЮ. function grade_sort($x, $y) { if ($x[" оценка "] < $y[" оценка "]) { return true; } else if ($x["оценка"] > $y["оценка"]) { return false; } else { return 0; } }

Затем возьмем пользовательскую функцию и осуществим перебор двумерного массива PHP по первому ключу. Выглядит это примерно так:

// $students – наш многомерный массив, а grade_sort – созданная функция usort ($students, " grade_sort ");

Пример :

// Вызвать на печать массив в виде (начальный массив): echo "

Массив в виде

" . print_r($students, 1) . "
"; // Сортировать по оценке (grade): uasort($students, "grade_sort"); echo "

Массив отсортирован по оценке

" . print_r($students, 1) . "
";

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

function grade_sort($x, $y) { static $count = 1; echo “

Iteration $count: {$x[‘оценка’]} vs. {$y[‘оценка’]}

n”; $count++; if ($x[‘ оценка ‘] < $y[‘ оценка ‘]) { return true; } else if ($x[‘ключ1′] > $y[‘ключ1′]) { return false; } else { return 0; } }

Выводя на экран значения $x[‘оценка’] и $y [‘оценка’] , можно увидеть, как вызывается функция сортировки, определенная пользователем.

Можно сократить функцию grade_sort следующим образом:

// Функция числовой сортировки по оценке: сортировка по УБЫВАНИЮ function grade_sort($x, $y) { return ($x["grade"] < $y["grade"]); }

Результаты сортировки двумерного массива PHP по оценке отображены на картинке ниже:

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

B – Сортировка по имени (в алфавитном порядке)

Чтобы отсортировать массив $students по первому ключу, необходимо сравнить две строки. Поэтому в примере с сортировкой в алфавитном порядке воспользуемся функция strcasecmp() (не чувствительна к регистру ) и strcmp() (чувствительна к регистру ). Получившийся двумерный массив PHP будет иметь следующий вид:

// Функция сортировки по имени: function name_sort($x, $y) { return strcasecmp($x["имя"], $y["имя"]); }

Пример :

// Вывести на печать массив в виде (начальный массив): echo "

Массив в виде

" . print_r($students, 1) . "
"; // Сортировка по имени: uasort($students, "name_sort"); echo "

Массив отсортирован по имени

" . print_r($students, 1) . "
";

На скриншоте, приведенном ниже, показан результат сортировки по имени:


Перевод статьи «Sorting multi-dimensional array in PHP » был подготовлен дружной командой проекта .