array_multisort
Сортирует набор массивов или многомерные массивы
&reftitle.description;
truearray_multisort
arrayarray1
mixedarray1_sort_orderSORT_ASC
mixedarray1_sort_flagsSORT_REGULAR
mixedrest
Функцией array_multisort пользуются
для одновременной сортировки набора массивов или одного многомерного массива
по одному или большему количеству уровней вложенности.
Ассоциативные ключи с типом string сохранятся,
но числовые ключи переиндексируются.
¬e.sort-unstable;
¬e.reset-index;
&reftitle.parameters;
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
Дополнительные массивы, за которыми необязательно идёт направление сортировки и флаги.
Функция сравнивает только элементы, которые соответствуют эквивалентным элементам
в предыдущих массивах. То есть функция сортирует массивы в лексикографическом порядке.
&reftitle.returnvalues;
&return.true.always;
&reftitle.changelog;
&Version;
&Description;
8.5.0
Теперь тип возвращаемого значения — &true;; ранее был bool.
&reftitle.examples;
Сортировка набора массивов
]]>
В приведённом примере после сортировки
первый массив будет содержать значения: 0, 10, 100, 100,
а второй — 4, 1, 2, 3. Функция также отсортировала записи во втором
массиве, которые соответствуют одинаковым записям в первом массиве — 100 и 100.
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)
}
]]>
Сортировка многомерного массива
]]>
В этом примере после сортировки функция преобразует первый массив в:
"10", 100, 100, 11, "a", функция отсортировала элементы массива как строки
в возрастающем порядке. Второй массив будет содержать: 1, 3, "2", 2, 1,
функция отсортировала элементы как числа в порядке убывания.
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)
}
}
]]>
Сортировка результатов из базы данных
В этом примере каждый элемент массива data представляет
строку таблицы. Такой набор данных типичен
для записей базы данных.
Примерные данные:
Данные в виде массива с названием data. Такие
данные часто получают в цикле функцией наподобие mysqli_fetch_assoc.
В следующем примере функция отсортирует данные по полю volume
по убыванию, а по полю edition — по возрастанию.
Мы получили массив строк базы данных, но функция array_multisort
требует массив столбцов, поэтому сначала вызовем код, который
получит столбцы, а затем отсортируем данные.
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);
// Получаем список столбцов
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);
// Перебираем данные и выводим отсортированные значения для каждого столбца
echo 'volume | edition', PHP_EOL;
echo '-------+--------', PHP_EOL;
for ($i = 0; $i < count($data); $i++) {
printf("%6d | %7d\n", $volume[$i], $edition[$i]);
}
?>
]]>
Функция отсортировала набор данных и теперь он выглядит вот так:
Сортировка без учёта регистра
Обе константы — SORT_STRING
и SORT_REGULAR — учитывают регистр при
сортировке, поэтому строки, которые начинаются с заглавной буквы, будут
идти раньше строк, которые начинаются со строчной буквы.
Чтобы отсортировать данные без учёта регистра, порядок сортировки
определяют для копии исходного массива, которую привели к нижнему регистру.
]]>
&example.outputs;
Alpha
[1] => atomic
[2] => bank
[3] => Beta
)
]]>
&reftitle.seealso;
usort
&seealso.array.sorting;