array_multisort

(PHP 4, PHP 5, PHP 7, PHP 8)

array_multisortСортирует несколько массивов или многомерные массивы

Описание

array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags = SORT_REGULAR,
    mixed ...$rest
): bool

Функцией 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
)

Смотрите также