PHP: сортировка массива по значению элементов и другие полезные функции

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'.

Комментарии