PHP предоставляет разнообразный инструментарий для работы с массивами данных. Одна из частых задач - упорядочивание элементов массива, т.е. сортировка. В статье подробно рассматриваются способы сортировки массивов в PHP по значению элементов, в том числе многомерных структур. Приводятся практические советы и рекомендации.
1. Базовые функции сортировки
Для сортировки массивов по значению элементов в PHP предусмотрено несколько базовых функций:
- sort() - сортирует массив по возрастанию значений элементов
- rsort() - сортирует массив по убыванию значений элементов
- asort() - сортирует массив по возрастанию сохраняя соответствие ключей и значений
- arsort() - сортирует массив по убыванию сохраняя соответствие ключей и значений
Рассмотрим их подробнее.
Сортировка по значению без сохранения ключей
Функции sort() и rsort() выполняют сортировку массива по значениям элементов. При этом соответствие ключей и значений теряется. Порядок ключей после сортировки может измениться произвольным образом.
Например, изначально массив выглядел так:
$arr = [
1 => 'Яблоко', 3 => 'Апельсин', 2 => 'Груша' ];После сортировки sort():
$arr = [ 0 => 'Апельсин', 1 => 'Груша', 2 => 'Яблоко' ];
Как видно из примера, порядок ключей был нарушен. Элемент с ключом 1 стал иметь ключ 0 после сортировки. А функция rsort() выполнит ту же сортировку, но в обратном порядке.
Сортировка по значению с сохранением ключей
Функции asort() и arsort() также выполняют сортировку элементов массива по значению. Но в отличие от sort()/rsort() они сохраняют соответствие ключей и значений.
Например, исходный массив:
$arr = [ 1 => 'Яблоко', 3 => 'Апельсин', 2 => 'Груша' ];
После вызова asort():
$arr = [ 1 => 'Апельсин', 2 => 'Груша', 3 => 'Яблоко' ];
Здесь видно, что элементы отсортированы по алфавиту, но ключи остались прежними. А функция arsort() выполнит эту же сортировку в обратном порядке.
Выбор подходящей функции сортировки
При выборе функции сортировки необходимо учитывать, требуется ли сохранять порядок ключей в массиве после сортировки. Если это важно - следует использовать asort() или arsort(). В противном случае достаточно базовых sort()/rsort().
2. Дополнительные возможности
Помимо базовых функций сортировки, в PHP есть ряд дополнительных возможностей для более тонкой настройки сортировки массивов.
Флаги сортировки
Для большинства функций сортировки можно указать дополнительный параметр-флаг, который позволяет точно определить желаемый порядок сортировки:
- SORT_REGULAR - обычный порядок сортировки без преобразования типов значений;
- SORT_NUMERIC - сортировать как числовые значения;
- SORT_STRING - сортировать как строковые значения;
- SORT_NATURAL - естественная сортировка значений как строк.
Например, чтобы отсортировать массив чисел как строки в алфавитном порядке, можно использовать флаг SORT_STRING:
sort($arr, SORT_STRING);
А для сортировки строк в порядке "10", "2", "1" вместо "1", "10", "2" применим SORT_NATURAL:
sort($arr, SORT_NATURAL);
Естественная сортировка с помощью natsort()
Функция natsort() выполняет сортировку массива как строк по "естественному" порядку следования значений. Она эквивалентна вызову sort() с флагом SORT_NATURAL. Пример использования:
$arr = ["img1.png", "img10.png", "img2.png"]; natsort($arr); // Массив отсортирован как ["img1.png", "img2.png", "img10.png"]
Рекомендации по использованию флагов
Флаги сортировки следует использовать в тех случаях, когда требуется отклониться от стандартного порядка сортировки значений как строк. Например, для числовых или смешанных массивов. А функция natsort() удобна для "умной" сортировки строковых значений.
В следующих частях статьи мы подробно рассмотрим другие полезные функции для сортировки массивов в PHP.
3. Сортировка по ключам
Если требуется упорядочить элементы массива по ключам, а не значениям, можно воспользоваться специальными функциями:
- ksort() - сортирует по ключам по возрастанию
- krsort() - сортирует по ключам по убыванию
Синтаксис и особенности
Синтаксис этих функций такой же, как и у sort()/rsort():
ksort($arr); krsort($arr);
Главное отличие в том, что сортировка происходит не по значениям массива, а по его ключам. При этом значения остаются "привязанными" к переставленным ключам.
Пример сортировки ассоциативного массива по ключам
Исходный массив:
$arr = [ 'apricot' => 'Абрикос', 'pear' => 'Груша', 'apple' => 'Яблоко'];
После вызова ksort():
$arr = [ 'apple' => 'Яблоко', 'apricot' => 'Абрикос', 'pear' => 'Груша'];
Как видно из примера, ключи массива после сортировки расположены по алфавиту, а значения остались на своих позициях.
Когда применять сортировку по ключам
Такая сортировка полезна в тех случаях, когда ключи несут смысловую нагрузку и их порядок важен. Например, если ключи - это идентификаторы объектов в базе данных или имена сотрудников компании.
4. Пользовательская сортировка
Иногда требуемый порядок сортировки определяется нестандартной бизнес-логикой. В таких случаях на помощь приходят функции uasort() и usort().
Создание callback-функции сравнения
Эти функции для сортировки используют дополнительную функцию сравнения элементов массива (callback). В ней реализуется пользовательская логика, определяющая порядок следования элементов после сортировки.
function cmp($a, $b) { if ($a['count'] < $b['count']) return -1; else if ($a['count'] > $b['count']) return 1; else return 0; }
Здесь сравнение элементов $a и $b происходит по значению ключа 'count'. Функция должна возвращать -1, 0 или 1 в зависимости от результата сравнения.
Пример сортировки массива по произвольному критерию
Используем функцию uasort() для сортировки массива $arr с помощью callback-функции cmp():
uasort($arr, "cmp");
В результате массив будет отсортирован по возрастанию значения ключа 'count'.