array_multisort()
Glossary overview

array_multisort()

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_orderSORT_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);