Как выполняется сортировка массивов PHP: от базовых методов до пользовательских правил

Раздел: 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 для обратного порядка.

Сортировка массива в PHP - comments

En
Php сортировка массива (php)