W3docs

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

Изучите встроенные функции сортировки массивов в PHP: sort, rsort, asort, ksort, usort и другие — с примерами.

Введение в сортировку массивов PHP

Массив в PHP — это коллекция элементов, хранимых и доступных по индексу (числовой позиции) или ключу (метке). Сортировка означает перестановку элементов в заданном порядке — по возрастанию, убыванию, по значению, по ключу или по вашему собственному правилу.

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

Различия между функциями сортировки

Два вопроса определяют, какая функция вам нужна:

  1. Сортировка по значению или по ключу? Обычные списки (индексированные массивы) сортируются по значению; ассоциативные массивы можно сортировать по любому из них.
  2. Нужно ли сохранять связь ключ→значение? sort()/rsort() удаляют исходные ключи и переиндексируют массив с 0. Семейство a* и k* сохраняет эту связь.
ФункцияСортирует поПорядокСохраняет ключи?
sort()значениюпо возрастаниюнет (переиндексация)
rsort()значениюпо убываниюнет (переиндексация)
asort()значениюпо возрастаниюда
arsort()значениюпо убываниюда
ksort()ключупо возрастаниюда
krsort()ключупо убываниюда
usort()значению (произвольно)ваше правилонет (переиндексация)
uasort()значению (произвольно)ваше правилода
uksort()ключу (произвольно)ваше правилода

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

Сортировка массивов по возрастанию

Функция sort() сортирует массив по возрастанию: строки — в алфавитном порядке, числа — в числовом. Она изменяет исходный массив на месте и переиндексирует его с 0, поэтому исходные ключи теряются. Избегайте смешивания типов данных в одном массиве, так как сравнения, например, строк и чисел могут давать неожиданные результаты.

$fruits = ['lemon', 'orange', 'banana', 'apple'];
sort($fruits);
print_r($fruits);
// Output: Array ( [0] => apple [1] => banana [2] => lemon [3] => orange )

Сортировка массивов по убыванию

Функция rsort() является обратной к sort() — она упорядочивает элементы от большего к меньшему. Как и sort(), она работает на месте и переиндексирует массив.

$numbers = [5, 2, 9, 1, 7];
rsort($numbers);
print_r($numbers);
// Output: Array ( [0] => 9 [1] => 7 [2] => 5 [3] => 2 [4] => 1 )

Сортировка ассоциативных массивов по значению

Когда ключи несут смысловую нагрузку (имена, идентификаторы, метки), используйте функции семейства a*, чтобы пары ключ→значение оставались вместе. Функция asort() сортирует по значению по возрастанию; arsort() делает то же самое по убыванию.

$ages = ['Peter' => 35, 'John' => 28, 'Mary' => 32];
asort($ages);
print_r($ages);
// Output: Array ( [John] => 28 [Mary] => 32 [Peter] => 35 )

Обратите внимание, что каждое имя остаётся привязанным к своему возрасту — в этом и заключается отличие от sort(), которая удалила бы имена.

Сортировка ассоциативных массивов по ключу

Функция ksort() сортирует по ключу по возрастанию, сохраняя каждый ключ привязанным к своему значению; krsort() сортирует по ключу по убыванию.

$colors = ['red' => '#FF0000', 'blue' => '#0000FF', 'green' => '#008000'];
ksort($colors);
print_r($colors);
// Output: Array ( [blue] => #0000FF [green] => #008000 [red] => #FF0000 )

Сортировка в естественном порядке

При обычной строковой сортировке символы сравниваются один за другим, поэтому 'img10' оказывается перед 'img2' (потому что '1' < '2'). Функция natsort() использует алгоритм «естественного порядка», который сравнивает встроенные числа как числа — так, как человек упорядочивал бы имена файлов. Ключи при этом сохраняются.

$files = ['img12.png', 'img10.png', 'img2.png', 'img1.png'];
natsort($files);
print_r($files);
// Output: Array ( [3] => img1.png [2] => img2.png [1] => img10.png [0] => img12.png )

Используйте natcasesort() для того же поведения без учёта регистра.

Произвольная сортировка с помощью usort()

Когда встроенных порядков недостаточно — при сортировке объектов, многомерных массивов или по вычисляемому значению — usort() позволяет передать собственную функцию сравнения. Колбэк получает два элемента и должен вернуть отрицательное число, 0 или положительное число в зависимости от того, должен ли первый элемент стоять перед вторым, быть равным ему или стоять после него.

$people = [
    ['name' => 'Mary', 'age' => 32],
    ['name' => 'Peter', 'age' => 35],
    ['name' => 'John', 'age' => 28],
];

usort($people, function ($a, $b) {
    return $a['age'] <=> $b['age']; // spaceship operator: ascending by age
});

foreach ($people as $person) {
    echo $person['name'] . ': ' . $person['age'] . "\n";
}
// Output:
// John: 28
// Mary: 32
// Peter: 35

Оператор <=> («космический корабль») возвращает именно -1 / 0 / 1, которые нужны колбэку, что делает его идиоматическим выбором здесь. Если нужно сохранить ключи, используйте uasort(); для сортировки по произвольному правилу ключей — uksort().

Выбор правильной функции

  • Простой список, ключи не важны → sort() / rsort().
  • Ассоциативный массив, сортировка по значению с сохранением ключей → asort() / arsort().
  • Ассоциативный массив, сортировка по ключу → ksort() / krsort().
  • Имена файлов или строки, подобные версиям → natsort() / natcasesort().
  • Объекты, вложенные массивы или любое произвольное правило → usort() / uasort() / uksort().

Если нужно лишь перевернуть существующий порядок без полной пересортировки, array_reverse() обойдётся дешевле. Для совместной сортировки нескольких массивов или по нескольким столбцам см. array_multisort().

Заключение

PHP предоставляет полный набор инструментов для упорядочивания массивов, и правильный выбор сводится к двум вопросам: сортировать по значению или по ключу, и нужно ли сохранять привязку ключей? sort() и rsort() подходят для простых списков, семейство a*/k* — для ассоциативных данных, natsort() — для удобного человеку порядка, а семейство u* — для всего нестандартного. Помните, что все эти функции сортируют на месте и возвращают boolean, а не новый массив.

Практика

Практика
Какие из следующих функций являются встроенными функциями сортировки в PHP?
Какие из следующих функций являются встроенными функциями сортировки в PHP?
Was this page helpful?