You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何仅基于新键合并多维数组,保留用户已有设置

如何合并PHP多维数组并保留用户已有键值

看起来你想要合并两个多维数组,核心需求是完全保留用户已保存的键值,仅添加新架构里出现但用户设置中没有的新键。我来给你几种解决方案,从针对当前场景的简单写法到通用的递归方法都有。


针对当前二维数组的快速解法

你的数组只有options这一层子数组,直接用array_merge就能搞定,但要注意顺序:把新架构的数组放在前面,用户的设置放在后面,这样用户的键会覆盖新架构里的同名键,同时新架构里的新键会被保留下来。

$arr1 = [
    'options' => [
        'first' => 1,
        'second' => 2,
        'third' => 3,
    ]
];

$arr2 = [
    'options' => [
        'first' => 1,
        'second' => 212,
        'fourth' => 4
    ]
];

// 合并逻辑:先取新架构的options,再用用户的options覆盖同名键,同时保留用户原有的其他键
$arr3 = [
    'options' => array_merge($arr2['options'], $arr1['options'])
];

// 输出结果
print_r($arr3);

运行后你会得到符合需求的结果:

Array
(
    [options] => Array
        (
            [first] => 1
            [second] => 2
            [fourth] => 4
            [third] => 3
        )

)

注意:你提供的示例输出里遗漏了原arr1中的third键和arr2中新的fourth键,按照需求逻辑,这两个键都应该被保留/添加,上面的结果才是正确的合并结果。


更通用的递归解法(支持任意层级的多维数组)

如果你的数组结构可能更复杂(比如有多层嵌套的子数组),可以写一个递归函数来处理,确保每一层都遵循“保留已有值,仅添加新键”的规则:

function mergePreservingUserSettings(array $userSettings, array $newSchema) {
    foreach ($newSchema as $key => $value) {
        // 如果当前键在用户设置中存在,且都是数组,就递归合并子数组
        if (isset($userSettings[$key]) && is_array($value) && is_array($userSettings[$key])) {
            $userSettings[$key] = mergePreservingUserSettings($userSettings[$key], $value);
        } 
        // 如果用户设置中没有这个键,就添加新键值对
        elseif (!isset($userSettings[$key])) {
            $userSettings[$key] = $value;
        }
        // 其他情况(用户已有该键且不是数组):什么都不做,保留用户原有值
    }
    return $userSettings;
}

// 使用函数合并
$arr3 = mergePreservingUserSettings($arr1, $arr2);

print_r($arr3);

这个函数的优势在于不管数组有多少层嵌套,都能正确处理,比如如果options下面还有子数组,也能完美保留用户的已有设置,同时添加新的子键。


内容的提问来源于stack exchange,提问作者undefinedman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:20:48