Сортирует набор массивов или многомерные массивы

# array_multisort

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

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

### Описание

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

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

### Список изменений

Версия | Описание
--- | ---
8.5.0 | Теперь тип возвращаемого значения — `true`; ранее был bool.

### Примеры

Пример #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().

В следующем примере функция отсортирует данные по полю volume по убыванию, а по полю edition — по возрастанию.

Мы получили массив строк базы данных, но функция array_multisort() требует массив столбцов, поэтому сначала вызовем код, который получит столбцы, а затем отсортируем данные.

    <?php

    // Данные наподобие тех, которые создаёт функция mysqli_fetch_assoc при переборе результатов запроса в цикле:
    $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);

    // Получаем список столбцов
    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]);
    }

    ?>

Функция отсортировала набор данных и теперь он выглядит вот так:

    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() - Сортирует массив по значениям через пользовательскую функцию сравнения элементов
- Сравнение функций сортировки массивов

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open