(PHP 4, PHP 5, PHP 7, PHP 8)
array_multisort — Сортирует несколько массивов или многомерные массивы
&$array1
,$array1_sort_order
= SORT_ASC,$array1_sort_flags
= SORT_REGULAR,...$rest
Функцией array_multisort() пользуются для одновременной сортировки нескольких массивов или одного многомерного массива по одному или несколькими уровням вложенности.
Ассоциативные строковые (string) ключи будут сохранены, но числовые ключи будут переиндексированы.
Замечание:
Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.
Замечание:
Функция сбрасывает внутренний указатель массива на первый элемент.
array1
Сортируемый массив (array).
array1_sort_order
Порядок сортировки предыдущего аргумента массива (array).
Указывают константу SORT_ASC
для сортировки по возрастанию
или константу SORT_DESC
для сортировки по убыванию.
Этот аргумент разрешено менять местами с аргументом array1_sort_flags
или не указывать, тогда функция возьмёт за основу значение SORT_ASC
.
array1_sort_flags
Настройки сортировки для предыдущего аргумента массива (array):
Флаг способа сортировки:
SORT_REGULAR
— обычное сравнение элементов
(без изменения типов)
SORT_NUMERIC
— числовое сравнение элементов
SORT_STRING
— строковое сравнение элементов
SORT_LOCALE_STRING
— строковое сравнение элементов
с учётом установленного языкового стандарта (локали). Функция выберет языковой стандарт,
который разрешено изменять функцией setlocale()
SORT_NATURAL
— строковое сравнение элементов
через алгоритм естественной сортировки (natural order), как в функции natsort()
SORT_FLAG_CASE
— разрешено объединять через бинарное ИЛИ
с константой SORT_STRING
или SORT_NATURAL
для сортировки строк без учёта регистра
Этот аргумент разрешено менять местами с аргументом array1_sort_order
или не указывать, тогда функция возьмёт за основу значение SORT_REGULAR
.
rest
Дополнительные массивы, за которыми необязательно идёт направление сортировки и флаги. Функция сравнивает только элементы, которые соответствуют эквивалентным элементам в предыдущих массивах. То есть функция сортирует массивы в лексикографическом порядке.
Функция возвращает true
, если выполнилась успешно, или false
, если возникла ошибка.
Пример #1 Сортировка нескольких массивов
<?php
$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);
var_dump($ar1);
var_dump($ar2);
?>
В приведённом примере после сортировки первый массив будет содержать значения: 0, 10, 100, 100. Второй — 4, 1, 2, 3. Функция также отсортировала записи во втором массиве, которые соответствуют одинаковым записям в первом массиве (100 и 100).
array(4) { [0]=> int(0) [1]=> int(10) [2]=> int(100) [3]=> int(100) } array(4) { [0]=> int(4) [1]=> int(1) [2]=> int(2) [3]=> int(3) }
Пример #2 Сортировка многомерного массива
<?php
$ar = array(
array("10", 11, 100, 100, "a"),
array(1, 2, "2", 3, 1)
);
array_multisort(
$ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC
);
var_dump($ar);
?>
В этом примере после сортировки функция преобразует первый массив в: «10», 100, 100, 11, «a» (функция отсортировала его элементы как строки в возрастающем порядке). Второй массив будет содержать: 1, 3, «2», 2, 1 (функция отсортировала элементы как числа в порядке убывания).
array(2) { [0]=> array(5) { [0]=> string(2) "10" [1]=> int(100) [2]=> int(100) [3]=> int(11) [4]=> string(1) "a" } [1]=> array(5) { [0]=> int(1) [1]=> int(3) [2]=> string(1) "2" [3]=> int(2) [4]=> int(1) } }
Пример #3 Сортировка результатов из базы данных
В этом примере каждый элемент массива data — это строка таблицы. Такой набор данных типичен для записей базы данных.
Примерные данные:
# том | издание volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7
Данные в виде массива с именем data. Такие данные обычно получают в цикле, например, функцией mysqli_fetch_assoc().
<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
?>
В этом примере функция отсортирует данные по полю volume по убыванию, а по полю edition — по возрастанию.
Мы получили массив строк базы данных, но функция array_multisort() требует массив столбцов, поэтому сначала вызовем код, который получит столбцы, а затем отсортируем данные.
<?php
// Получаем список столбцов
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
// Получение тех же данных функцией array_column() вместо перебора
$volume = array_column($data, 'volume');
$edition = array_column($data, 'edition');
// Сортируем данные по полю volume по убыванию и по полю edition по возрастанию
// Добавляем переменную $data в качестве последнего параметра, для сортировки по общему ключу
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>
Функция отсортировала набор данных и теперь он выглядит вот так:
volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7
Пример #4 Сортировка без учёта регистра
Обе константы — SORT_STRING
и SORT_REGULAR
— учитывают регистр при
сортировке, поэтому строки, которые начинаются с заглавной буквы, будут
идти раньше строк, которые начинаются со строчной буквы.
Чтобы отсортировать данные без учёта регистра, порядок сортировки определяют для копии исходного массива, которую привели к нижнему регистру.
<?php
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);
print_r($array);
?>
Результат выполнения приведённого примера:
Array ( [0] => Alpha [1] => atomic [2] => bank [3] => Beta )