Как отсортировать массив в PHP 13 способами: инструкция с примерами
Становимся настоящими ниндзя в сортировке массивов. Вместо оружия — встроенные функции PHP, быстрые и точные, как катана.
Иллюстрация: Polina Vari для Skillbox Media
В PHP массивом называют структуру данных, которая позволяет хранить упорядоченный набор значений по принципу ключ => значение. И количество инструментов для работы с массивами тут впечатляет: для одной только сортировки существует 13 встроенных функций! В этой статье мы покажем, как ими пользоваться, чтобы получать информацию в нужном виде.
Способы сортировки
Все функции PHP для сортировки массивов «конструируются» из четырёх основных критериев:
- вид сортировки — по ключу или значениям;
- порядок сортировки — восходящий, нисходящий, естественный, пользовательский и прочие;
- способ обработки ключей — с сохранением связи или нет;
- наличие уточняющих опций — в семи из этих функций можно указать предпочтительный способ сортировки и дополнительные параметры («флаги»).
Вот функции, которые позволяют это сделать:
У каждой из функций есть название, указывающее на вид сортировки и завершающееся круглыми скобками. Эти названия на первый взгляд кажутся не особо говорящими, поэтому для начала лучше выбирать функцию под конкретную задачу, сверяясь с табличкой на официальном сайте. При этом легко запомнить, что функции с буквой «k» сортируют массивы по ключам.
В зависимости от выбранной функции внутри скобок указывается массив или несколько массивов для сортировки, а затем могут идти опции (флаги):
- SORT_REGULAR — сравнивать элементы в нормальном порядке, не меняя типов;
- SORT_NUMERIC — сравнивать элементы как числа;
- SORT_STRING — сравнивать элементы как строки;
- SORT_LOCALE_STRING — сравнивать элементы как строки, руководствуясь текущим местонахождением, то есть локалью (Locale);
- SORT_NATURAL — сравнивать элементы как строки в естественном порядке;
- SORT_FLAG_CASE — можно объединить с SORT_STRING или SORT_NATURAL, чтобы сделать сортировку нечувствительной к регистру.
Давайте попробуем в действии отсортировать массивы разными способами. В этом нам помогут редактор кода Notepad++ и среда разработки XAMPP для запуска PHP-кода в браузере.
Во всех примерах будем сначала выводить исходный массив, а затем его же после сортировки (помните, что сортировка меняет массив, то есть её результат сохраняется). Для удобства чтения будем осуществлять вывод с помощью привычной функции echo в связке с implode()/print_r() или циклом foreach.
Также для красоты будем сопровождать результаты подписями (HTML-заголовки <h2> и <h3>) и переносом строк (HTML-элемент <br>).
Числовая сортировка: зарплаты
Создадим массив чисел и отсортируем его в порядке убывания, от большего значения к меньшему. Возьмём самый простой пример: массив зарплат в рублях:
Так он выглядит с выводом результата.
Исходный массив вакансий по зарплатам целиком, до сортировки:
Массив вакансий по зарплатам до сортировки — только значения (исходный порядок):
Как видим, сейчас зарплаты внутри массива расположены в произвольном порядке, а нам бы хотелось сначала увидеть самые выгодные вакансии. Значит, надо найти в таблице такой метод, который умеет сортировать значения в порядке убывания — нам подойдёт rsort().
Объяснение:
- rsort() — название функции, в скобках указываются параметры;
- $array — массив для сортировки;
- на месте опции FLAGS можно указать другие правила сортировки массива (флаги).
А теперь попробуем нашу функцию в деле. На первом шаге передадим в неё массив с зарплатами — $salaries.
Далее прописываем вывод результата:
Вот что у нас получилось на выходе:
Теперь возьмёмся за массив текстовых значений.
Текстовая сортировка: виды птиц
По данным Большой российской энциклопедии, в мире насчитывается более двухсот видов сов. Было бы неплохо создать про них сайт, чтобы каждый мог узнать о совах побольше! Начнём с создания «массива сов», руководствуясь книгой Ю. Б. Пукинского «Жизнь сов».
Исходный массив названий видов сов целиком, до сортировки:
Названия видов сов до сортировки — только значения (исходный порядок):
В данном случае в роли ключей ассоциативного массива у нас выступают латинские названия видов, а значениями являются русские названия.
В зависимости от задачи нам может понадобиться как латинское, так и русское название. Кроме этого, было бы интересно иметь возможность получать информацию о случайно выбранной сове, а ещё — представлять текстовые значения в алфавитном порядке.
Отсюда вытекает необходимость использования сразу трёх различных функций сортировки:
- ksort() для сортировки по ключам (латинским названиям) по алфавиту;
- asort() для сортировки по значениям (русским названиям), также по алфавиту;
- shuffle() для получения случайных русских названий сов.
Синтаксис ksort() и asort() такой же, как и в предыдущем примере у rsort(), а с shuffle() всё ещё проще — она принимает только название массива.
Посмотрим на функции в деле:
Названия видов сов после сортировки через ksort() (по ключу, по алфавиту, по возрастанию):
Названия видов сов после сортировки через asort() (по значению, по алфавиту, по возрастанию):
Названия видов сов после сортировки через shuffle() (по значению, случайный порядок):
Совы встали на свои места, а мы двигаемся дальше — к сортировке, имитирующей человеческую логику.
Естественная сортировка: страницы во «ВКонтакте»
Предположим, у нас есть список подписчиков нашей группы в одном из возможных форматов — ссылками с id вида vk.com/idXXX.
Исходный массив ссылок на страницы во «Вконтакте», до сортировки:
Было бы удобно расположить записи в порядке возрастания id, но есть нюанс: элементы массива являются строковыми значениями. Вот что показывает проверка типов:
Вывод результата после проверки типа данных в массиве ссылок на страницы во «Вконтакте»:
Чтобы решить задачу, воспользуемся функцией естественной сортировки natsort().
Объяснение:
- natsort() — название функции, в скобках указывается единственный параметр;
- $array — массив, который нужно отсортировать естественным способом (как это бы сделал человек).
Посмотрим на функцию в деле:
Массив ссылок на страницы во «Вконтакте» после естественной сортировки через natsort() (по значению, по возрастанию):
Теперь страницы отсортированы в удобном для работы формате.
Сортировка многомерного массива: цены на топливо
Для примера возьмём двумерный массив, состоящий, в свою очередь, из двух массивов: марок автомобильного топлива и цен на него некоторое время назад.
Марки топлива и цены на него до сортировки (исходный порядок):
Сейчас здесь есть взаимное соответствие (например, АИ-92 стоит 47,60), но сами значения не отсортированы в каком-либо порядке. Попробуем с помощью функции сортировки array_multisort() вывести для пользователя список ценников, отсортированный по возрастанию, где сначала идёт самый дешёвый бензин.
Функция array_multisort() предназначена как раз для сортировки многомерных массивов. Вот её синтаксис:
Объяснение:
- array_multisort() — название функции, в скобках указываются параметры;
- $array1 — первый массив для сортировки;
- на месте опции $array1_sort_order можно указать порядок сортировки первого массива (можно не указывать);
- на месте опции $array1_sort_flags можно указать другие правила сортировки первого массива (флаги) в дополнение к предыдущей опции;
- на месте $other можно вписать ещё один массив $array2 с опциями или без (и так далее).
Применим функцию в деле:
Вывод отсортированного массива марок топлива и цен через array_multisort() (по возрастанию):
Теперь марки топлива расположены по возрастанию цены, а мы возьмём ещё более интересный пример — сортировку по кастомным правилам.
Пользовательская сортировка: сотрудники компании
Предположим, у нашей компании есть корпоративный портал, где можно посмотреть информацию о коллегах. Пусть у нас в массиве будет шесть коллег. База содержит Ф. И. О., внутренний ID, должность и возраст, а карточка каждого сотрудника является отдельным массивом многомерного массива:
Код вывода исходного массива карточек сотрудников компании:
Вывод исходного массива карточек сотрудников компании до сортировки (исходный порядок):
Дадим пользователю корпоративного портала возможность сортировки списка по фамилиям, возрасту и порядковому номеру. В этом нам поможет функция пользовательской сортировки usort().
Объяснение:
- usort() — название функции, в скобках указываются параметры.
- $array — массив для сортировки.
- «function» — название вашей функции сравнения с собственными правилами сортировки. Она объявляется заранее и принимает два параметра. Обратите внимание на кавычки, в которые заключается название.
Применим функцию в деле — на сортировке сотрудников по алфавиту, по возрасту (по возрастанию) и по ID (по убыванию).
Обратите внимание:
- В каждом из трёх примеров ниже мы сначала объявляем пользовательскую функцию сравнения (alphSort, ageSort и idSort соответственно), а потом передаём её встроенной функции usort() в качестве обработчика массива.
- Цикл foreach помогает по очереди перебирать карточки каждого сотрудника в главном массиве $employees. Для удобства мы в рамках цикла обзываем их $employee — то же самое английское слово в единственном числе.
- Для доступа к нужным ключам вложенных массивов (карточек сотрудников) используется синтаксис с квадратными скобками: $array[«key»] и так далее.
Функция alphSort() принимает по два значения ФИО ($name1 и $name2) и сравнивает их как строки с помощью встроенной функции strcmp(). Она передаётся во встроенную функцию usort(), где и применяется на нашем массиве.
Вывод отсортированного массива карточек сотрудников компании. Вариант первый — ФИО по алфавиту:
Следующие два примера строятся по похожему принципу. Вот код для сортировки массива карточек сотрудников компании. Вариант второй — по возрасту.
Функция ageSort() должна сравнивать по два значения возраста сотрудников (в данном примере — $age1, $age2), и возвращать результат (отсортированный массив) в зависимости от результата сравнения. Она также передаётся во встроенную функцию usort().
Вывод отсортированного массива карточек сотрудников компании. Вариант второй — по возрасту:
Код для сортировки массива карточек сотрудников компании. Вариант третий — по ID:
Аналогично прошлому примеру, здесь функция idSort() тоже заточена на сравнение по двум значениям — теперь это ID сотрудников ($id1, $id2) — и возвращает результат (отсортированный массив) в зависимости от результата сравнения.
Вывод отсортированного массива карточек сотрудников компании. Вариант третий — по ID:
Итоги
Мы рассмотрели основные виды сортировок массивов в PHP: числовую, алфавитную, естественную, многомерную и пользовательскую. Для всего этого мы нашли подходящие функции.
Для более детального знакомства с функциями сортировки массивов в PHP рекомендуем пользоваться таблицами-напоминалками: в разных руководствах они сделаны по-разному, поэтому лучше найти ту табличку, которая будет удобна именно вам. А для синтаксически правильного применения советуем пользоваться официальной документацией языка, тем более она переведена на русский.