Array Multisort в PHP: Подробное руководство
Узнайте, как array_multisort() сортирует параллельные массивы и несколько столбцов одновременно в PHP.
array_multisort() сортирует один или несколько массивов одновременно. Главная сила этой функции — сортировка параллельных массивов: нескольких массивов, представляющих столбцы одного набора данных, — так что при изменении порядка в одном остальные двигаются синхронно, сохраняя соответствие строк. На этой странице рассматриваются синтаксис, многоколоночная сортировка (разрешение ничьих), особенность переиндексации ключей и отличия от sort() и usort().
Синтаксис
array_multisort(
array &$array1,
mixed $array1_sort_order = SORT_ASC,
mixed $array1_sort_flags = SORT_REGULAR,
mixed ...$rest
): boolАргументы считываются группами: за каждым массивом может следовать необязательная константа порядка сортировки и необязательная константа флагов сортировки. Функция сортирует на месте (массивы передаются по ссылке) и возвращает true в случае успеха, false — в случае ошибки.
| Константа | Действие |
|---|---|
SORT_ASC | Сортировка по возрастанию (по умолчанию) |
SORT_DESC | Сортировка по убыванию |
SORT_REGULAR | Сравнивать элементы обычным образом (по умолчанию) |
SORT_NUMERIC | Сравнивать элементы как числа |
SORT_STRING | Сравнивать элементы как строки |
Сортировка одного массива
В простейшей форме функция ведёт себя как sort() — упорядочивает один массив на месте:
$data = [3, 1, 2];
array_multisort($data);
print_r($data);Вывод:
Array
(
[0] => 1
[1] => 2
[2] => 3
)Сортировка параллельных массивов (основной сценарий использования)
Предположим, у вас есть два массива, связанных по индексу, — один с возрастами, другой с именами, — и вы хотите отсортировать по возрасту, сохраняя привязку каждого имени к своему возрасту. Передайте оба массива: первый задаёт порядок, а все остальные переупорядочиваются так же:
$ages = [25, 25, 30];
$names = ['John', 'Jane', 'Alice'];
array_multisort($ages, SORT_ASC, $names, SORT_ASC);
print_r($ages);
print_r($names);Вывод:
Array
(
[0] => 25
[1] => 25
[2] => 30
)
Array
(
[0] => Jane
[1] => John
[2] => Alice
)Обратите внимание на разрешение ничьей: оба 25-летних остаются на своих местах, но поскольку был указан второй массив ($names, SORT_ASC), строки с одинаковым возрастом упорядочиваются по имени — Jane перед John.
Сортировка по нескольким критериям
Чтобы разрешить ничьи, перечислите массивы в порядке приоритета: первый массив — основной ключ сортировки, следующий разрешает ничьи в первом, и так далее. Каждый массив получает собственный флаг порядка, что позволяет смешивать восходящие и нисходящие столбцы:
$volume = [67, 86, 85, 98, 86, 67];
$edition = [2, 1, 6, 2, 6, 7];
// Sort by volume DESC, then by edition ASC for equal volumes.
array_multisort($volume, SORT_DESC, $edition, SORT_ASC);
print_r($volume);
print_r($edition);Вывод:
Array
(
[0] => 98
[1] => 86
[2] => 86
[3] => 85
[4] => 67
[5] => 67
)
Array
(
[0] => 2
[1] => 1
[2] => 6
[3] => 6
[4] => 2
[5] => 7
)Два значения 86 и два значения 67 остаются вместе, а внутри каждой ничьей издания идут по возрастанию.
Сортировка массива строк по столбцу
Реальные наборы данных нередко представляют собой массив ассоциативных строк. Используйте array_column(), чтобы извлечь столбцы, по которым нужно сортировать, а затем передайте исходный массив последним — он будет переупорядочен соответствующим образом:
$rows = [
['name' => 'Bob', 'age' => 30],
['name' => 'Alice', 'age' => 25],
['name' => 'Carol', 'age' => 30],
];
$age = array_column($rows, 'age');
$name = array_column($rows, 'name');
// Primary: age ASC. Tie-break: name ASC.
array_multisort($age, SORT_ASC, $name, SORT_ASC, $rows);
print_r($rows);Вывод:
Array
(
[0] => Array ( [name] => Alice [age] => 25 )
[1] => Array ( [name] => Bob [age] => 30 )
[2] => Array ( [name] => Carol [age] => 30 )
)Особенность: ключи переиндексируются
array_multisort() переиндексирует числовые ключи (они становятся 0, 1, 2, …), но строковые ключи сохраняются. Если нужно сохранить исходные целочисленные ключи, отсортируйте копию ключей вместе с данными или используйте функцию, учитывающую ключи, например asort().
Когда использовать ту или иную функцию сортировки
- Используйте
array_multisort(), когда у вас есть параллельные массивы или нужна многоколоночная сортировка. - Используйте
sort()/rsort()для сортировки одного массива по значению, когда ключи не важны. - Используйте
ksort()/asort()для сортировки по ключу или по значению с сохранением ключей. - Используйте
usort(), когда одному массиву требуется пользовательская логика сравнения (например, сортировка по длине строки или по вычисленному значению), которую нельзя выразить флагами.
Смотрите обзор Сортировка массивов для сравнения всех функций сортировки рядом.
graph LR
A[Array] --> B[Array Multisort]
B --> C[Ascending/Descending Order]
B --> D[Sorting by Key]
B --> E[Sorting by Multiple Criteria]