W3docs

PHP Array Merge: Подробное руководство

Функция PHP array_merge() объединяет два и более массива в один. Узнайте, как она работает со строковыми и числовыми ключами.

Функция PHP array_merge() объединяет два или более массива в один. Она принимает один или несколько массивов в качестве аргументов и возвращает новый array; исходные массивы остаются неизменными. В этом руководстве рассматривается, как array_merge() обрабатывает строковые ключи, числовые ключи и вложенные массивы, какие подводные камни следует учитывать и чем она отличается от оператора объединения +.

Два правила, которые объясняют почти каждый результат:

  • Строковые ключи, присутствующие более чем в одном array, перезаписываются — побеждает значение из более позднего array.
  • Числовые ключи никогда не перезаписываются. Каждое значение добавляется, а ключи переиндексируются последовательно, начиная с 0.

Примечание: начиная с PHP 8.0, передача не-array аргумента в array_merge() вызывает TypeError. (В PHP 7 это приводило к предупреждению и возврату null.) Вызов array_merge() без аргументов возвращает пустой array.

Базовое использование array_merge()

Базовое использование функции array_merge() очень простое. Достаточно передать два или более массива в качестве аргументов, и функция вернёт новый array, являющийся результатом слияния массивов. Пример:

Пример использования функции array_merge в PHP

php— editable, runs on the server

Вывод:

Array
(
    [color] => green
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => rectangle
    [4] => 4
)

Обратите внимание на два момента в выводе:

  • Строковый ключ color есть в обоих массивах, поэтому значение из $array2 (green) перезаписало значение из $array1 (red).
  • Числовые ключи не были сохранены. Исходные значения 2 и 4 из $array1 и 4 из $array2 — все они были сохранены (ничего не было перезаписано) и перенумерованы в 0, 1, 4.

Переиндексация числовых ключей

Поскольку числовые ключи перенумеровываются, нельзя рассчитывать на сохранение исходных целочисленных ключей после слияния. Вызов array_merge() даже с одним array — это распространённый и быстрый способ переиндексировать его:

<?php

$nums = [10 => "a", 25 => "b", 7 => "c"];
$result = array_merge($nums);
print_r($result);

?>

Вывод:

Array
(
    [0] => a
    [1] => b
    [2] => c
)

Если нужно сохранить конкретные целочисленные ключи, используйте оператор объединения + или array_replace().

Слияние многомерных массивов

Функцию array_merge() также можно использовать для слияния многомерных массивов. Для этого нужно просто передать каждый array в качестве аргумента функции. Пример:

PHP: слияние многомерных массивов с помощью array_merge_recursive

php— editable, runs on the server

Вывод:

Array
(
    [color] => Array
        (
            [favorite] => green
        )
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => rectangle
    [4] => 4
)

Обратите внимание, что array_merge() не выполняет слияние вложенных массивов. Когда два массива разделяют строковый ключ, значением которого является array, вложенное значение из более позднего array полностью заменяет предыдущее — здесь ["favorite" => "green"] просто перезаписало ["favorite" => "red"]. Для рекурсивного слияния вложенных массивов вместо их перезаписи используйте array_merge_recursive().

array_merge() и оператор объединения

PHP также предоставляет оператор + для объединения массивов, но он ведёт себя совершенно иначе, чем array_merge(). Оператор объединения сохраняет значение из левого операнда при совпадении ключей и никогда не переиндексирует числовые ключи.

<?php

$array1 = ["a", "b", "c"];
$array2 = ["x", "y", "z", "w"];

print_r(array_merge($array1, $array2)); // appends + reindexes
print_r($array1 + $array2);             // keeps left, no reindex

?>

Вывод:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => x
    [4] => y
    [5] => z
    [6] => w
)
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => w
)

При использовании array_merge() каждый элемент сохраняется и перенумеровывается. При использовании + индексы 02 уже существовали в $array1 и побеждают, а из $array2 добавляется только индекс 3 (w). Используйте +, когда нужно заполнить отсутствующие ключи (например, при слиянии пользовательских настроек с параметрами по умолчанию), сохраняя существующие значения и целочисленные ключи; используйте array_merge(), когда нужен плоский, последовательно индексированный список. Подробнее см. в разделе Операторы PHP.

Слияние индексированного массива с ассоциативным

При слиянии индексированного array с ассоциативным значения из обоих массивов объединяются. Пример:

PHP: пример слияния индексированного массива с ассоциативным с помощью функции array_merge

php— editable, runs on the server

Вывод:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [a] => apple
    [b] => banana
    [c] => cherry
)

Как видно, значения из обоих массивов объединяются. Поскольку ключи разных типов (числовые и строковые), перезаписи не происходит. Это важный момент, который необходимо учитывать при слиянии массивов с ключами разных типов.

Слияние ассоциативного массива с индексированным

Результат слияния ассоциативного array с индексированным аналогичен. Значения объединяются, а ключи сохраняются в соответствии с их типом. Пример:

PHP: слияние ассоциативного массива с индексированным с помощью функции array_merge

php— editable, runs on the server

Вывод:

Array
(
    [a] => apple
    [b] => banana
    [c] => cherry
    [0] => a
    [1] => b
    [2] => c
)

Как показано, значения объединяются без конфликтов. Строковые ключи из $array1 сохраняются, а числовые ключи из $array2 переиндексируются начиная с 0.

Производительность

Функция array_merge() имеет линейную временну́ю сложность, то есть время слияния массивов увеличивается линейно с их размером. По этой причине важно сводить к минимуму количество объединяемых массивов и избегать применения функции к очень большим массивам.

Заключение

Функция array_merge() — это универсальный инструмент для объединения массивов в PHP. Запомните два основных правила: строковые ключи перезаписываются более поздними массивами, а числовые ключи добавляются и переиндексируются начиная с 0. Если это поведение по умолчанию не подходит, выберите другую функцию:

  • array_merge_recursive() — выполняет слияние вложенных массивов вместо их перезаписи.
  • array_replace() — заменяет значения по ключу, сохраняя числовые ключи.
  • Оператор объединения + — сохраняет значения левого операнда и не переиндексирует.
  • array_combine() — создаёт array из отдельного массива ключей и массива значений.

Практика

Практика
Что верно в отношении функции array_merge в PHP?
Что верно в отношении функции array_merge в PHP?
Was this page helpful?