使用PHP array_merge合并数组时空字符串键值丢失问题咨询
问题成因
array_merge() 是浅合并逻辑,仅处理数组第一层的键值:
- 当两个数组存在相同的字符串键名时,后传入数组的对应值会直接覆盖前一个数组的同键值,不会递归进入数组内部合并子层级的键
- 你代码中
$defaultOptions['item']和$options['item']是同名键,合并时整个$defaultOptions['item']数组都被传入的$options['item']完全替换,自然前者包含的hasChildrenClass等未在后者中定义的键会丢失。
解决方法
方法1:使用递归替换函数(推荐)
PHP内置的array_replace_recursive()会递归遍历数组层级,子层级相同键名才会用后值覆盖前值,前数组存在而后数组不存在的键会被保留,完全适配配置项合并的场景,只需要修改合并代码即可:
$options = array_replace_recursive($defaultOptions, $options);
注意不要误用
array_merge_recursive(),该函数遇到同键名会将两个值合并为新数组,不会做覆盖处理,不符合配置项覆盖的常规需求。
方法2:自定义递归合并函数
如果你需要自定义合并规则,可以自己实现简易的递归合并逻辑:
function recursiveMerge($defaults, $custom) { foreach ($custom as $key => $value) { if (is_array($value) && isset($defaults[$key]) && is_array($defaults[$key])) { $defaults[$key] = recursiveMerge($defaults[$key], $value); } else { $defaults[$key] = $value; } } return $defaults; } // 调用 $options = recursiveMerge($defaultOptions, $options);
内容的提问来源于stack exchange,提问作者Oliv
相关产品推荐
相关产品推荐

