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
Вывод:
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
Вывод:
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() каждый элемент сохраняется и перенумеровывается. При использовании + индексы 0–2 уже существовали в $array1 и побеждают, а из $array2 добавляется только индекс 3 (w). Используйте +, когда нужно заполнить отсутствующие ключи (например, при слиянии пользовательских настроек с параметрами по умолчанию), сохраняя существующие значения и целочисленные ключи; используйте array_merge(), когда нужен плоский, последовательно индексированный список. Подробнее см. в разделе Операторы PHP.
Слияние индексированного массива с ассоциативным
При слиянии индексированного array с ассоциативным значения из обоих массивов объединяются. Пример:
PHP: пример слияния индексированного массива с ассоциативным с помощью функции array_merge
Вывод:
Array
(
[0] => a
[1] => b
[2] => c
[a] => apple
[b] => banana
[c] => cherry
)Как видно, значения из обоих массивов объединяются. Поскольку ключи разных типов (числовые и строковые), перезаписи не происходит. Это важный момент, который необходимо учитывать при слиянии массивов с ключами разных типов.
Слияние ассоциативного массива с индексированным
Результат слияния ассоциативного array с индексированным аналогичен. Значения объединяются, а ключи сохраняются в соответствии с их типом. Пример:
PHP: слияние ассоциативного массива с индексированным с помощью функции array_merge
Вывод:
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 из отдельного массива ключей и массива значений.