array_multisort - Сортирует несколько массивов или многомерные массивы
Вернуться к: Функции для работы с массивами
array_multisort
(PHP 4, PHP 5, PHP 7)
array_multisort — Сортирует несколько массивов или многомерные массивы
Описание
&$array1
[, mixed $array1_sort_order = SORT_ASC
[, mixed $array1_sort_flags = SORT_REGULAR
[, mixed $...
]]] )Функция 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- может быть объединен (бинарное OR) с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. Обычно их можно получить, к пример, с помощью цикла из функции mysql_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'];
}
// Сортируем данные по 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
)
Смотрите также
- usort() - Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
- Сравнение функций сортировки массивов
Вернуться к: Функции для работы с массивами