array_multisort() — мощная, но недооценённая функция в PHP для сортировки нескольких массивов одновременно, при этом сохраняя связь между ними. Особенно крута для сортировки многомерных массивов (например, массивов с ассоциативными данными).
Что делает array_multisort()?
- Сортирует один или несколько массивов одновременно.
- Если сортируется несколько массивов — сортировка второго идёт только если в первом одинаковые значения.
- Может сортировать по значениям вложенных массивов, если передать
array_column()как вспомогательный массив.
Ключевые особенности:
✅ Можешь сортировать массивы по числам, строкам, датам и т.д.
✅ Работает на переданных по ссылке массивах (изменяет оригиналы!)
✅ Отлично сочетается с array_column() для сортировки по вложенным значениям
⚠️ Не работает с ассоциативными ключами — пересортирует в числовые!
Синтаксис
array_multisort(array &$array1, mixed $sort_order = SORT_ASC, mixed $sort_flags = SORT_REGULAR, ...): bool
$array1— первый массив (ориентир сортировки).$sort_order—SORT_ASCилиSORT_DESC.$sort_flags— напримерSORT_NUMERIC,SORT_STRING,SORT_REGULAR.
👉 Можешь указывать пары: массив → порядок → флаг, и таких пар может быть сколько угодно.
Пример 1: Сортировка двух массивов
$a = [3, 1, 2];
$b = ['three', 'one', 'two'];
array_multisort($a, SORT_ASC, $b);
print_r($a); // [1, 2, 3]
print_r($b); // ['one', 'two', 'three']
b отсортировался в том же порядке, что и a.
Пример 2: Сортировка многомерного массива по колонке
$data = [
['name' => 'Charlie', 'score' => 75],
['name' => 'Alice', 'score' => 85],
['name' => 'Bob', 'score' => 65],
];
// Вытаскиваем колонку с баллами
$scores = array_column($data, 'score');
// Сортируем по убыванию
array_multisort($scores, SORT_DESC, $data);
print_r($data);
// Вывод
[
['name' => 'Alice', 'score' => 85],
['name' => 'Charlie', 'score' => 75],
['name' => 'Bob', 'score' => 65],
]
Пример 3: Сортировка по нескольким колонкам
Допустим, у тебя есть массив студентов, и ты хочешь сортировать сначала по курсу, потом по имени:
$students = [
['name' => 'John', 'course' => 2],
['name' => 'Alice', 'course' => 1],
['name' => 'Bob', 'course' => 2],
];
$courses = array_column($students, 'course');
$names = array_column($students, 'name');
array_multisort($courses, SORT_ASC, $names, SORT_ASC, $students);
Пример 4
$users = [
['id' => 1, 'name' => 'Alice', 'age' => 32],
['id' => 2, 'name' => 'Bob', 'age' => 25],
['id' => 3, 'name' => 'Charlie', 'age' => 40],
];
// Вытаскиваем колонку с возрастами
$ages = array_column($users, 'age'); // Результат: [32, 25, 40]
// Сортируем $users по $ages
array_multisort($ages, SORT_ASC, $users);
print_r($users);
// Вывод
Array
(
[0] => Array ( [id] => 2 [name] => Bob [age] => 25 )
[1] => Array ( [id] => 1 [name] => Alice [age] => 32 )
[2] => Array ( [id] => 3 [name] => Charlie [age] => 40 )
)
Здесь array_multisort() работает так:
- Сортирует массив
$agesпо возрастанию:[25, 32, 40] - И вместе с ним переставляет строки массива
$users, чтобы они остались синхронизированы
🔁 То есть — сортирует $users по age, потому что $ages является “сортировочным ориентиром”.
Почему не просто sort()?
Потому что sort() сортирует сам массив, а array_multisort() позволяет:
- Сортировать по значению из вложенных массивов
- И оставить данные связанными между собой
Фишки:
Хочешь отсортировать по нескольким колонкам? Например, сначала по age, потом по name — тоже можно:
$ages = array_column($users, 'age');
$names = array_column($users, 'name');
array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);