PHP中array_replace_recursive无法用空数组更新二级数组键问题
解决PHP中array_replace_recursive无法用空数组更新二级数组键的问题
你碰到的这个问题其实是array_replace_recursive的设计逻辑导致的——这个函数的核心是递归合并数组,而不是直接覆盖。当源数组和替换数组的对应键值都是数组时,它会把两个数组的内容合并到一起,而不是用替换值直接替换掉原有的数组。
举个例子,你的测试代码里:
- 原数组的
elm2['subElm2']是一个非空数组['a','b'] - 替换数组的
elm2['subElm2']是空数组[]
因为两者都是数组,array_replace_recursive会尝试合并它们,空数组合并到非空数组里,结果自然还是原来的非空数组,这就导致你的空数组替换没生效。
解决方案:自定义递归替换函数
我们可以写一个自定义函数,在遇到替换值是空数组的情况时,直接用它覆盖原数组的对应值,而不是合并:
function array_replace_recursive_custom($base, $replacements) { foreach ($replacements as $key => $value) { // 只有当双方都是数组,且替换数组非空时才递归合并 if (isset($base[$key]) && is_array($base[$key]) && is_array($value) && !empty($value)) { $base[$key] = array_replace_recursive_custom($base[$key], $value); } else { // 否则直接覆盖(包括替换值是空数组的情况) $base[$key] = $value; } } return $base; }
测试验证
用你的测试代码跑一遍这个自定义函数:
$base = ['elm1' => 'Foo', 'elm2' => ['subElm1' => 'bar', 'subElm2' => ['a','b']]]; $replacement = ['elm2' => ['subElm2' => []]]; $result = array_replace_recursive_custom($base, $replacement); print_r($result);
输出结果就是你期望的:
Array ( [elm1] => Foo [elm2] => Array ( [subElm1] => bar [subElm2] => Array ( ) ) )
这个自定义函数保留了array_replace_recursive的递归合并特性,同时解决了空数组无法覆盖的问题,适合通用场景。
内容的提问来源于stack exchange,提问作者Sagar Bakhtar
相关产品推荐
相关产品推荐

