sort()
Сортировка массивов в PHP: функции sort(), asort(), ksort(), usort() и их варианты с примерами и пояснениями.
Введение
Сортировка — одна из самых распространённых операций с массивами: упорядочение прайс-листа, расстановка имён по алфавиту, ранжирование результатов. PHP поставляется с целым набором функций сортировки, и выбор нужной зависит от двух вопросов: сортировать по значению или по ключу? и нужно ли сохранить исходные ключи?
В этой главе объясняется sort() и её родственные функции, показан вывод каждой из них, а также даются рекомендации по выбору правильной функции с первого раза.
Понимание сортировки массивов в PHP
Функции сортировки массивов в PHP изменяют массив на месте (по ссылке) и возвращают true при успехе или false при ошибке — они не возвращают новый отсортированный массив. Поэтому всегда пишите sort($arr);, но никогда $arr = sort($arr);.
Функции образуют предсказуемый паттерн именования:
| Функция | Сортирует по | Сохраняет связи ключ-значение? | Порядок |
|---|---|---|---|
sort() | значению | Нет (переиндексирует 0,1,2…) | по возрастанию |
rsort() | значению | Нет | по убыванию |
asort() | значению | Да | по возрастанию |
arsort() | значению | Да | по убыванию |
ksort() | ключу | Да | по возрастанию |
krsort() | ключу | Да | по убыванию |
usort() | пользовательская (значение) | Нет | пользовательский |
uasort() | пользовательская (значение) | Да | пользовательский |
uksort() | пользовательская (ключ) | Да | пользовательский |
Паттерн легко читается, если знать правила: начальная a означает «сохранять Ассоциации ключей», k — «сортировать по Ключу», r — «Реверс», а u — «определённая пользователем функция сравнения».
sort()
Функция sort() сортирует массив по значению в порядке возрастания. Она подходит для простых индексированных (списковых) массивов, когда исходные ключи не важны — и в этом её особенность: sort() удаляет существующие ключи и переиндексирует массив с нуля. Никогда не используйте её для ассоциативного массива, который нужно сохранить в исходном виде.
$numbers = [3, 1, 2];
sort($numbers);
print_r($numbers);Вывод:
Array
(
[0] => 1
[1] => 2
[2] => 3
)Функция также работает со строками, сравнивая их в алфавитном порядке:
$fruits = ["banana", "apple", "cherry"];
sort($fruits);
print_r($fruits);
// Array ( [0] => apple [1] => banana [2] => cherry )Правило сравнения можно переопределить с помощью необязательного второго аргумента flags — например SORT_NUMERIC, SORT_STRING или SORT_NATURAL (который сортирует "img10" после "img2" так, как ожидает человек).
asort()
Функция asort() сортирует по значению в порядке возрастания, но сохраняет связь ключ-значение. Используйте её, когда ключи несут смысловую нагрузку — например, в ассоциативном массиве имён и баллов.
$scores = ['Alice' => 85, 'Bob' => 92, 'Charlie' => 78];
asort($scores);
print_r($scores);Вывод (строки переупорядочены, но каждое имя сохраняет свой балл):
Array
(
[Charlie] => 78
[Alice] => 85
[Bob] => 92
)Сравните это с sort($scores), который заменил бы Charlie/Alice/Bob на 0/1/2, полностью потеряв имена.
ksort()
Функция ksort() сортирует массив по ключам в порядке возрастания, сохраняя каждый ключ вместе с его значением. Это удобно, когда ключи являются идентификаторами, датами или метками, которые нужно упорядочить.
$data = ['c' => 3, 'a' => 1, 'b' => 2];
ksort($data);
print_r($data);Вывод:
Array
(
[a] => 1
[b] => 2
[c] => 3
)usort() и uasort()
Когда встроенных порядков сортировки недостаточно — при сортировке объектов, по вложенному полю или по бизнес-правилам — передайте собственную функцию сравнения. usort() сортирует обычный массив (переиндексируя ключи), а uasort() делает то же самое, но сохраняет ключи.
Функция обратного вызова получает два элемента и должна вернуть целое число: отрицательное, если первый должен идти перед вторым, положительное — если после, и ноль — если они равны. Оператор «космический корабль» <=> возвращает именно это значение, поэтому он является идиоматическим выбором.
$people = [
['name' => 'Alice', 'age' => 30],
['name' => 'Bob', 'age' => 25],
['name' => 'Carol', 'age' => 35],
];
usort($people, function ($a, $b) {
return $a['age'] <=> $b['age']; // sort by age, ascending
});
foreach ($people as $p) {
echo $p['name'] . ": " . $p['age'] . "\n";
}Вывод:
Bob: 25
Alice: 30
Carol: 35Для сортировки по убыванию поменяйте операнды местами: return $b['age'] <=> $a['age'];.
Сортировка по убыванию
Для простой обратной сортировки используйте варианты с префиксом r вместо написания пользовательского обратного вызова: rsort() (по значению, переиндексирует), arsort() (по значению, сохраняет ключи) и krsort() (по ключу, сохраняет ключи).
$numbers = [3, 1, 2];
rsort($numbers);
print_r($numbers);
// Array ( [0] => 3 [1] => 2 [2] => 1 )Если нужна «человекопонятная» буквенно-цифровая сортировка, обратите внимание на natsort(), которая сортирует ["img12", "img2"] как img2, img12, а не в строгом ASCII-порядке img12, img2.
Практические применения сортировки массивов в PHP
Сортировка массивов в PHP имеет различные практические применения, в том числе:
Сортировка массивов цен на товары
При разработке интернет-магазина может потребоваться сортировать товары по цене. С помощью функций сортировки массивов PHP можно упорядочить массив цен по возрастанию или убыванию, позволяя покупателям фильтровать товары по ценовому диапазону.
Сортировка массивов записей из базы данных
При получении данных из базы данных может потребоваться сортировать записи по определённым критериям, например по дате, времени или в алфавитном порядке. С помощью функций сортировки массивов PHP можно упорядочить записи уже после их получения, что упрощает анализ данных.
Сортировка массивов пользовательского ввода
При сборе данных от пользователей может потребоваться сортировать их по определённым критериям, например по возрасту или местоположению. С помощью функций сортировки массивов PHP можно упорядочить введённые данные по возрастанию или убыванию, что облегчает их отображение другим пользователям.
Заключение
Выбор правильной функции сортировки сводится к двум вопросам: упорядочиваете ли вы по значению или по ключу, и нужно ли сохранять исходные ключи? Используйте sort()/rsort() для простых списков, asort()/arsort() и ksort()/krsort() когда ключи важны, и usort()/uasort() когда нужны пользовательские правила. Поскольку все эти функции сортируют на месте и возвращают булево значение, не забывайте вызывать их как операторы, а не присваивать их результат обратно в массив.