PHP-функция: array_replace_recursive()
Функция array_replace_recursive() в PHP объединяет массивы, сохраняя структуру и ключи исходных массивов.
Функция array_replace_recursive() в PHP объединяет массивы, сохраняя структуру и ключи исходных массивов. Она заменяет элементы первого массива элементами из последующих массивов, рекурсивно спускаясь во вложенные массивы. Это делает её идеальным инструментом, когда нужно наложить один многомерный массив поверх другого — например, применить пользовательские настройки поверх конфигурации по умолчанию без «уплощения» вложенных данных.
В этой главе рассматриваются синтаксис функции, принцип работы рекурсии, несколько практических примеров (включая несколько массивов замены), а также отличия от родственных функций — array_replace() и array_merge_recursive().
Синтаксис
Синтаксис функции array_replace_recursive() прост: первый аргумент — массив, который будет изменён, а последующие аргументы — массивы, элементы которых будут объединены с первым массивом.
Синтаксис функции PHP array_replace_recursive
array_replace_recursive(array $array, array ...$replacements): arrayПервый аргумент — базовый массив. Каждый следующий массив применяется поверх него слева направо, поэтому значение из более позднего массива имеет приоритет над тем же ключом в более раннем. Функция возвращает новый массив и не изменяет аргументы на месте.
Принцип работы
Функция array_replace_recursive() работает путём перебора всех элементов переданных массивов. Для каждого элемента функция проверяет, существует ли ключ в первом массиве. Если ключ отсутствует, элемент просто добавляется в первый массив. Если ключ существует, функция проверяет, является ли значение массивом. Если является, функция рекурсивно вызывает себя с текущим значением из первого массива и соответствующим значением из второго массива в качестве аргументов. Если значение не является массивом, оно просто заменяется значением из второго массива.
Этот процесс повторяется для всех последующих переданных массивов: элементы добавляются или заменяются в первом массиве по мере необходимости. Итогом является единый массив, полученный в результате слияния всех элементов входных массивов. Примечание: в отличие от array_merge_recursive(), данная функция заменяет числовые ключи, а не объединяет их по индексу.
Примеры
Несколько примеров использования функции array_replace_recursive() на практике:
PHP-пример использования функции array_replace_recursive
Вывод этого кода:
Array
(
[a] => Array
(
[b] => d
)
)Рекурсия срабатывает потому, что и $array1['a'], и $array2['a'] являются массивами, поэтому функция спускается в них и заменяет b, а не перезаписывает всю ветку a.
Ещё один пример:
PHP — ещё один пример использования функции array_replace_recursive
Вывод этого кода:
Array
(
[a] => d
)Здесь рекурсия не происходит: $array2['a'] — скалярная строка 'd', а не массив. Когда значение замены не является массивом, существующее значение (включая любой вложенный массив) полностью перезаписывается. Функция рекурсирует только тогда, когда значение существует как массив с обеих сторон.
Слияние нескольких массивов и добавление новых ключей
Можно передать любое количество массивов замены. Они применяются по порядку, а ключи, которых ещё нет, добавляются, а не заменяются.
PHP array_replace_recursive с несколькими массивами
<?php
$defaults = ['db' => ['host' => 'localhost', 'port' => 3306]];
$env = ['db' => ['host' => 'db.internal']];
$cli = ['db' => ['port' => 5432], 'debug' => true];
$result = array_replace_recursive($defaults, $env, $cli);
print_r($result);
?>Вывод этого кода:
Array
(
[db] => Array
(
[host] => db.internal
[port] => 5432
)
[debug] => 1
)Вложенные ключи host и port перекрываются последующими массивами, а совершенно новый ключ debug добавляется в конец. Именно такое наложение слева направо делает функцию незаменимой при послойном формировании конфигурации.
array_replace_recursive() и родственные функции
array_replace()выполняет то же наложение, но только на верхнем уровне — она никогда не спускается во вложенные массивы, поэтому вложенное значение всегда заменяется целиком.array_merge_recursive()объединяет значения с одинаковым ключом (превращая два скаляра в массив из обоих) вместо их замены и перенумеровывает целочисленные ключи.array_replace_recursive()оставляет одно замещающее значение и сохраняет исходные ключи.array_merge()— нерекурсивное слияние, которое также перенумеровывает целочисленные ключи.
Если цель — «взять эти значения по умолчанию и переопределить их другими значениями», используйте array_replace_recursive(). Если цель — «собрать всё под каждым ключом», используйте array_merge_recursive().
Заключение
Функция array_replace_recursive() в PHP предоставляет удобный способ объединения массивов с сохранением их исходной структуры и ключей. Она особенно ценна при обновлении вложенных конфигурационных данных или слиянии структурированных наборов данных без ручного перебора.