Как выполняется сортировка массивов PHP: от базовых методов до пользовательских правил
Сортировка массивов в PHP
Наиболее эффективный способ отсортировать индексированный массив по возрастанию значений - использовать функцию sort(). Она изменяет исходный массив, переставляя элементы по порядку, и сбрасывает ключи.
$fruits = ["лимон", "апельсин", "банан", "яблоко"];
sort($fruits);
print_r($fruits);
Php ключи массива (получение ключей массива в php)
Array
(
[0] => апельсин
[1] => банан
[2] => лимон
[3] => яблоко
)
Php массивы индексы (получение индексов массива в php)
Для сортировки по убыванию используется rsort().
rsort($fruits);
print_r($fruits);
массив данных php (работа с массивом данных в php)
Array
(
[0] => яблоко
[1] => лимон
[2] => банан
[3] => апельсин
)
массив ли php (проверка, является ли переменная массивом в php)
Важно: функции sort и rsort работают только с индексированными массивами. Для ассоциативных массивов используйте asort / arsort (сортировка по значениям с сохранением ключей) или ksort / krsort (сортировка по ключам).
Как отсортировать ассоциативный массив по значениям, не теряя ключи?
Функция asort() сортирует массив по значениям, сохраняя ассоциацию ключ-значение. arsort() делает то же самое, но в обратном порядке.
$ages = ["Иван" => 25, "Пётр" => 30, "Анна" => 22];
asort($ages);
print_r($ages);
Php разбить массив (разбиение массива на части в php)
Array
(
[Анна] => 22
[Иван] => 25
[Пётр] => 30
)
Php переменные массив (создание массива из переменных в php)
Как отсортировать массив по ключам?
Функции ksort() и krsort() сортируют массив по ключам.
$data = ["z" => 1, "a" => 2, "m" => 3];
ksort($data);
print_r($data);
Php сортировка массива (сортировка массива в php)
Array
(
[a] => 2
[m] => 3
[z] => 1
)
ассоциативный массив php (ассоциативные массивы в php)
Как отсортировать массив по пользовательскому правилу (например, по длине строки)?
Используется usort(), uasort() или uksort(). Они принимают callback-функцию сравнения.
$words = ["PHP", "JavaScript", "HTML"];
usort($words, function($a, $b) {
return strlen($a) - strlen($b);
});
print_r($words);
Php удалить массива (удаление всего массива в php)
Array
(
[0] => PHP
[1] => HTML
[2] => JavaScript
)
функции массива php (функции для работы с массивами в php)
Как отсортировать многомерный массив по одному из полей?
Часто используется usort вместе с замыканием. Например, сортировка массива пользователей по возрасту.
$users = [
["name" => "Иван", "age" => 30],
["name" => "Мария", "age" => 22],
["name" => "Пётр", "age" => 25]
];
usort($users, function($a, $b) {
return $a['age'] - $b['age'];
});
print_r($users);
Php удалить массив (удаление массива в php)
Array
(
[0] => Array ( [name] => Мария [age] => 22 )
[1] => Array ( [name] => Пётр [age] => 25 )
[2] => Array ( [name] => Иван [age] => 30 )
)
Php array keys (функция array_keys в php)
Как отсортировать массив случайным образом?
Функция shuffle() перемешивает элементы случайным образом, сбрасывая ключи.
$cards = [1, 2, 3, 4, 5];
shuffle($cards);
print_r($cards);
Php массив в строку (преобразование массива в строку php)
Array
(
[0] => 3
[1] => 1
[2] => 5
[3] => 4
[4] => 2
)
Php key (ключи и массивы в php)
Как отсортировать массив с учётом естественного порядка строк (например, “img1”, “img10”)?
Используйте natsort() или natcasesort().
$files = ["img10", "img2", "img1"];
natsort($files);
print_r($files);
Array
(
[0] => img1
[1] => img2
[2] => img10
)
Типичные ошибки и способы их решения
Ошибка 1: Попытка использовать sort() для ассоциативного массива. Функция sort() сбрасывает ключи, что приводит к потере ассоциаций.
Решение: Используйте asort() (при сортировке по значениям) или ksort() (при сортировке по ключам).
Ошибка 2: Неправильное возвращаемое значение в callback для usort. Функция должна возвращать целое число меньше нуля, ноль или больше нуля. Часто ошибаются, возвращая true/false.
Решение: Используйте оператор <=> (spaceship) или явное вычитание.
Ошибка 3: Сортировка с сохранением ключей в многомерном массиве с помощью usort. Функция usort сбрасывает ключи. Для сохранения ключей нужна uasort.
Решение: Если требуется сохранить строковые ключи, используйте uasort() вместо usort().
Ошибка 4: Использование функций сортировки без передачи массива по ссылке (все рассмотренные функции принимают массив по ссылке). Если массив не изменяется, возможно, вы передаёте копию.
Решение: Убедитесь, что вы передаёте переменную, а не результат вызова функции, возвращающей массив.
Проблема нестабильной сортировки: В старых версиях PHP сортировка могла менять порядок равных элементов. Начиная с PHP 8.0, все функции сортировки стабильны.
Если требуется стабильность в старых версиях, используйте array_multisort или пользовательскую сортировку с дополнительным полем стабильности.
Цели и случаи использования
sort/rsort- для простых списков без сохранения ключей (например, вывод имён по алфавиту).asort/arsort- для ассоциативных массивов, когда нужна сортировка по значениям (например, рейтинг пользователей).ksort/krsort- когда порядок определяется ключами (например, данные, индексированные датами).usort/uasort/uksort- для сложных критериев (например, сортировка объектов по нескольким полям).natsort- для сортировки строк с числами в естественном порядке (например, имена файлов).shuffle- для случайного перемешивания (например, карты в игре).array_multisort- для одновременной сортировки нескольких массивов или многомерного массива по нескольким столбцам.
Расширенные примеры сортировки
Пример 1: Многоуровневая сортировка многомерного массива (по возрасту, затем по имени)
$users = [
['name' => 'Иван', 'age' => 30],
['name' => 'Мария', 'age' => 22],
['name' => 'Анна', 'age' => 22],
['name' => 'Пётр', 'age' => 25]
];
usort($users, function($a, $b) {
$cmp = $a['age'] - $b['age'];
if ($cmp === 0) {
$cmp = strcmp($a['name'], $b['name']);
}
return $cmp;
});
print_r($users);
Array
(
[0] => Array ( [name] => Анна [age] => 22 )
[1] => Array ( [name] => Мария [age] => 22 )
[2] => Array ( [name] => Пётр [age] => 25 )
[3] => Array ( [name] => Иван [age] => 30 )
)
Пояснение: Сначала сравниваются возраста. Если они равны, сравниваются имена через strcmp. Результат - стабильная сортировка по двум полям.
Пример 2: Сортировка с помощью spaceship оператора (<=>)
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
usort($numbers, fn($a, $b) => $a <=> $b);
print_r($numbers);
Array
(
[0] => 1
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 9
)
Пояснение: Оператор <=> возвращает -1, 0 или 1, идеально подходит для usort. Стрелочная функция fn сокращает запись.
Пример 3: Сортировка ассоциативного массива по значению с сохранением ключей, используя uasort
$products = [
"Книга" => 450,
"Телефон" => 1200,
"Флешка" => 300
];
uasort($products, fn($a, $b) => $a <=> $b);
print_r($products);
Array
(
[Флешка] => 300
[Книга] => 450
[Телефон] => 1200
)
Пояснение: uasort сортирует по значениям, но сохраняет строковые ключи, что важно для ассоциативных данных.
Пример 4: Сортировка массива объектов по свойству
class User {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$users = [
new User('Иван', 30),
new User('Мария', 22),
new User('Пётр', 25)
];
usort($users, fn($a, $b) => $a->age <=> $b->age);
foreach ($users as $u) {
echo $u->name . ' (' . $u->age . ')' . PHP_EOL;
}
Мария (22) Пётр (25) Иван (30)
Пояснение: Сортируем массив объектов, обращаясь к публичному свойству age. Для приватных свойств используйте getter-методы.
Пример 5: Использование array_multisort для сортировки нескольких массивов одновременно
$names = ["Иван", "Мария", "Анна", "Пётр"];
$ages = [30, 22, 22, 25];
// Сортируем по возрасту (первый массив), затем по имени (второй массив)
array_multisort($ages, SORT_ASC, $names, SORT_ASC);
print_r($ages);
print_r($names);
Array
(
[0] => 22
[1] => 22
[2] => 25
[3] => 30
)
Array
(
[0] => Анна
[1] => Мария
[2] => Пётр
[3] => Иван
)
Пояснение: array_multisort принимает несколько массивов и сортирует их синхронно, как сводную таблицу. Можно задавать флаги сортировки (SORT_ASC, SORT_DESC, SORT_NUMERIC, SORT_STRING).
Пример 6: Сортировка многомерного массива по одному столбцу с помощью array_multisort (без потери ключей)
$data = [
['name' => 'Иван', 'age' => 30],
['name' => 'Мария', 'age' => 22],
['name' => 'Анна', 'age' => 25]
];
$ages = array_column($data, 'age');
array_multisort($ages, SORT_ASC, $data);
print_r($data);
Array
(
[0] => Array ( [name] => Мария [age] => 22 )
[1] => Array ( [name] => Анна [age] => 25 )
[2] => Array ( [name] => Иван [age] => 30 )
)
Пояснение: Извлекаем столбец age с помощью array_column, сортируем его и передаём исходный массив как ссылочный. Ключи остаются числовыми, но ассоциация сохраняется.
Пример 7: Сортировка с использованием natural order и обратным порядком
$files = ["img10", "img1", "img2", "img20"];
natcasesort($files); // регистронезависимая естественная сортировка
$files = array_reverse($files); // обратный порядок
print_r($files);
Array
(
[0] => img20
[1] => img10
[2] => img2
[3] => img1
)
Пояснение: natcasesort сортирует строки с числами так, как это делает человек (“img10” > “img2”). После сортировки применяем array_reverse для обратного порядка.