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
相关产品推荐
相关产品推荐

