W3docs

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

php— editable, runs on the server

Вывод этого кода:

Array
(
    [a] => Array
        (
            [b] => d
        )
)

Рекурсия срабатывает потому, что и $array1['a'], и $array2['a'] являются массивами, поэтому функция спускается в них и заменяет b, а не перезаписывает всю ветку a.

Ещё один пример:

PHP — ещё один пример использования функции array_replace_recursive

php— editable, runs on the server

Вывод этого кода:

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 предоставляет удобный способ объединения массивов с сохранением их исходной структуры и ключей. Она особенно ценна при обновлении вложенных конфигурационных данных или слиянии структурированных наборов данных без ручного перебора.

Практика

Практика
Что делает функция array_replace_recursive() в PHP?
Что делает функция array_replace_recursive() в PHP?
Was this page helpful?