(PHP 4, PHP 5, PHP 7)
array_multisort — Сортирует несколько массивов или многомерные массивы
&$array1
[, mixed $array1_sort_order
= SORT_ASC
[, mixed $array1_sort_flags
= SORT_REGULAR
[, mixed $...
]]] ) : boolФункция array_multisort() может быть использована для сортировки сразу нескольких массивов или одного многомерного массива в соответствии с одной или несколькими размерностями.
Ассоциативные (string) ключи будут сохранены, но числовые ключи будут переиндексированы.
Замечание:
Если оба сравниваемых значения эквивалентны, то порядок их в отсортированном массиве не определен.
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
.
...
Дополнительные массивы, необязательно следующие после порядка сортировки и флагов. Сравниваются только элементы соответствующие таким же элементам в предыдущих массивах. Другими словами, производится сортировка в лексикографическом порядке.
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Версия | Описание |
---|---|
5.4.0 |
Добавлены SORT_NATURAL и SORT_FLAG_CASE
в возможные флаги сортировки array1_sort_flags .
|
5.3.0 |
Добавлен SORT_LOCALE_STRING в возможные флаги сортировки
array1_sort_flags .
|
Пример #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'];
}
// Начиная с PHP 5.5.0 вы можете использовать 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 )