Сортировка массивов
Изучите встроенные функции сортировки массивов в PHP: sort, rsort, asort, ksort, usort и другие — с примерами.
Введение в сортировку массивов PHP
Массив в PHP — это коллекция элементов, хранимых и доступных по индексу (числовой позиции) или ключу (метке). Сортировка означает перестановку элементов в заданном порядке — по возрастанию, убыванию, по значению, по ключу или по вашему собственному правилу.
На этой странице рассматриваются встроенные функции сортировки PHP, их поведение и — что не менее важно — какую именно использовать в зависимости от того, важны ли вам ключи, значения или произвольный порядок.
Различия между функциями сортировки
Два вопроса определяют, какая функция вам нужна:
- Сортировка по значению или по ключу? Обычные списки (индексированные массивы) сортируются по значению; ассоциативные массивы можно сортировать по любому из них.
- Нужно ли сохранять связь ключ→значение?
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, а не новый массив.