ZetCode

PHP array_replace_recursive 函数

最后修改于 2025 年 3 月 13 日

PHP array_replace_recursive 函数通过递归地用后面的数组替换前面的数组中的值来合并数组。它处理嵌套数组。

基本定义

array_replace_recursive 递归地用后续数组中的值替换第一个数组中的值。如果一个键存在于多个数组中,则最后一个值获胜。

语法:array_replace_recursive(array $array1, array ...$arrays): array。它接受一个或多个数组并返回合并后的数组。非数组值将被直接替换。

基本 array_replace_recursive 示例

这演示了两个具有一些重叠键的数组的简单合并。

basic_replace_recursive.php
<?php

$defaults = [
    'settings' => [
        'debug' => false,
        'log_level' => 'warning'
    ],
    'features' => ['search', 'filter']
];

$custom = [
    'settings' => [
        'debug' => true
    ],
    'features' => ['export']
];

$result = array_replace_recursive($defaults, $custom);

print_r($result);

这会将默认设置与自定义设置合并。debug 设置被替换,而其他值保持不变。features 数组被完全替换(非递归)。

深层嵌套数组替换

展示了嵌套数组如何递归合并,而标量值被替换。

nested_arrays.php
<?php

$config1 = [
    'database' => [
        'host' => 'localhost',
        'credentials' => [
            'user' => 'admin',
            'pass' => 'secret'
        ]
    ]
];

$config2 = [
    'database' => [
        'credentials' => [
            'pass' => 'newpass'
        ],
        'port' => 3306
    ]
];

$merged = array_replace_recursive($config1, $config2);

print_r($merged);

密码被递归更新,同时保留了其他凭据。新端口被添加,原始主机保持不变。这显示了深度合并行为。

多个数组替换

演示了合并两个以上具有重叠和唯一键的数组。

multiple_arrays.php
<?php

$base = [
    'colors' => ['red', 'green'],
    'sizes' => ['S', 'M']
];

$update1 = [
    'colors' => ['blue'],
    'sizes' => ['L']
];

$update2 = [
    'colors' => ['yellow'],
    'shapes' => ['circle']
];

$result = array_replace_recursive($base, $update1, $update2);

print_r($result);

最终的 colors 数组只包含来自最后一次更新的 'yellow'。Sizes 数组显示来自 update1 的 'L'。Shapes 是从 update2 添加的。后面的数组优先。

混合数组和标量值

展示了标量值如何被替换,而数组如何被递归合并。

mixed_values.php
<?php

$original = [
    'title' => 'Default Title',
    'meta' => [
        'keywords' => ['php', 'tutorial'],
        'description' => 'Default description'
    ]
];

$changes = [
    'title' => 'New Title',
    'meta' => [
        'description' => 'Updated description'
    ]
];

$updated = array_replace_recursive($original, $changes);

print_r($updated);

title 标量值被完全替换。Meta 数组被递归合并,description 被更新,而 keywords 保持不变。这显示了混合行为。

保留数字键

演示了数字键与字符串键的处理方式不同。

numeric_keys.php
<?php

$array1 = [
    'a' => ['apple', 'apricot'],
    0 => ['zero']
];

$array2 = [
    'a' => ['banana'],
    0 => ['one'],
    1 => ['new']
];

$result = array_replace_recursive($array1, $array2);

print_r($result);

字符串键 'a' 被递归合并,新的水果替换了旧的。数字键被视为不同的 - 0 被完全替换。新键 1 从 array2 添加。

最佳实践

来源

PHP array_replace_recursive 文档

本教程通过实际示例介绍了 PHP array_replace_recursive 函数,展示了它在递归数组合并场景中的用法。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PHP 数组函数