Функция cot_arrayMergeRecursive в Cotonti

Разбор функции cot_arrayMergeRecursive

Функция cot_arrayMergeRecursive реализует слияние двух массивов, но с некоторыми отличиями от стандартной функции PHP array_merge_recursive. Она выполняет слияние массивов, заменяя значения элементов с одинаковыми ключами в первом массиве значениями из второго массива, в отличие от стандартной функции array_merge_recursive, которая преобразует дублирующиеся значения в массивы.

Код функции

/**
 * Native php function array_merge_recursive() does indeed merge arrays, but it converts values with duplicate
 * keys to arrays rather than overwriting the value in the first array with the duplicate value in the second array,
 * as array_merge() does.
 *
 * @param array $array1
 * @param array $array2
 * @return array
 *
 * @see array_merge()
 * @see array_merge_recursive()
 * @see https://www.php.net/manual/en/function.array-merge-recursive.php
 * @see https://www.php.net/manual/en/function.array-merge.php
 */
function cot_arrayMergeRecursive(array &$array1, array &$array2)
{
    $merged = $array1;
    foreach ($array2 as $key => &$value) {
        if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
            $merged [$key] = cot_arrayMergeRecursive($merged[$key], $value);
        } else {
            $merged[$key] = $value;
        }
    }
    return $merged;
}


Описание:

cot_arrayMergeRecursive(array &$array1, array &$array2)

Параметры:

$array1 (array) — первый массив, который будет изменен в процессе слияния.
$array2 (array) — второй массив, элементы которого будут добавлены или заменены в первом массиве.


Логика работы:


Создание нового массива для хранения результатов:

$merged = $array1; — создается копия первого массива, в которую будут добавляться элементы из второго массива.
Перебор элементов второго массива ($array2):

foreach ($array2 as $key => &$value) — каждый элемент второго массива перебирается в цикле. Переменная $key — это ключ элемента, а $value — его значение.

Рекурсивная обработка вложенных массивов:

if (is_array($value) && isset($merged[$key]) && is_array($merged[$key]))

 — если текущее значение из второго массива является массивом, и в первом массиве по тому же ключу также есть массив, то вызывается рекурсивная функция cot_arrayMergeRecursive для слияния этих двух вложенных массивов:

$merged[$key] = cot_arrayMergeRecursive($merged[$key], $value);



Заменить или добавить значение в первый массив:

Если значение из второго массива не является массивом, оно просто заменяет или добавляется в первый массив:


 

$merged[$key] = $value;


Возврат результата:

Функция возвращает обновленный массив $merged, который содержит элементы как из первого массива, так и из второго, с соответствующими заменами.

if ($cache && $cot_cfg) {
	$cfg = cot_arrayMergeRecursive($cot_cfg, $cfg);
}


Пример работы функции:

$array1 = [
    'a' => 1,
    'b' => [2, 3],
    'c' => 4
];

$array2 = [
    'b' => [5, 6],
    'c' => 7,
    'd' => 8
];

$result = cot_arrayMergeRecursive($array1, $array2);
print_r($result);


Результат:

Array
(
    [a] => 1
    [b] => Array
        (
            [0] => 5
            [1] => 6
        )
    [c] => 7
    [d] => 8
)

 

 

Объяснение:


Ключ 'b': вместо того, чтобы превращать значение в массив (как это делает array_merge_recursive), функция просто заменяет значения на новые.
Ключ 'c': значение из второго массива (7) заменяет значение из первого массива (4).
Ключ 'd': элемент добавляется в результат, так как его нет в первом массиве.

Сравнение с array_merge_recursive:


В array_merge_recursive для ключа 'b', если оба массива содержат массивы по этому ключу, результат будет:

[b] => Array
    (
        [0] => 2
        [1] => 3
        [2] => 5
        [3] => 6
    )



В отличие от этого, cot_arrayMergeRecursive просто заменяет значения массивов по этому ключу, если ключ уже существует в обоих массивах.


Резюме:
Функция cot_arrayMergeRecursive сливает два массива, заменяя значения с одинаковыми ключами из первого массива значениями из второго, и рекурсивно обрабатывает вложенные массивы.
Это более "жесткий" подход к слиянию массивов, чем в стандартной функции array_merge_recursive, которая оставляет значения с одинаковыми ключами в виде объединенных массивов.

 

3 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 21.01.2025 12:08
  • Последнее обновление: 21.01.2025 12:21