使用PHP array_merge合并数组并保留双方值的问题求助
问题分析
你遇到的问题是array_merge()的特性导致的:对于字符串键名的元素,后面数组的元素会直接覆盖前面数组的同名键元素,不管值是否为空。
看你的例子,$array[1]里的apples是空值,但它依然会覆盖$array[0]里apples的1,这就是为什么最终结果里apples变成空的,不符合你的预期。
你想要的是:合并两个关联数组,保留所有键,对于相同键的元素,优先保留第一个数组的非空值,没有的话用第二个数组的非空值填充,最后把合并后的数组放到外层数组的[0]位置。
解决方案
这里给你两种可行的实现方式:
方式一:遍历所有键手动合并(兼容性好,适合所有PHP版本)
// 你的原始数组 $array = [ ['apples' => 1, 'pears' => '', 'oranges' => '', 'grapes' => '', 'melons' => 1], ['apples' => '', 'pears' => 1, 'oranges' => 1, 'grapes' => '', 'melons' => '', 'pineapples' => '', 'bananas' => '', 'lemons' => ''] ]; $combined = []; // 获取两个数组的所有键的并集,确保不遗漏任何键 $allKeys = array_unique(array_merge(array_keys($array[0]), array_keys($array[1]))); foreach ($allKeys as $key) { // 优先取第一个数组的非空值,若为空则取第二个数组的值 if (isset($array[0][$key]) && !empty($array[0][$key])) { $combined[$key] = $array[0][$key]; } elseif (isset($array[1][$key])) { $combined[$key] = $array[1][$key]; } } // 将合并后的数组放到外层数组的[0]位置,得到你想要的结果 $result = [$combined]; // 输出结果 print_r($result);
方式二:用array_reduce简化代码(PHP 7.4+)
如果你的PHP版本在7.4及以上,可以用箭头函数结合array_reduce来简化代码:
$array = [ ['apples' => 1, 'pears' => '', 'oranges' => '', 'grapes' => '', 'melons' => 1], ['apples' => '', 'pears' => 1, 'oranges' => 1, 'grapes' => '', 'melons' => '', 'pineapples' => '', 'bananas' => '', 'lemons' => ''] ]; $combined = array_reduce( array_keys(array_merge($array[0], $array[1])), fn($carry, $key) => $carry + [$key => (!empty($array[0][$key]) ? $array[0][$key] : $array[1][$key])], [] ); $result = [$combined]; print_r($result);
结果验证
两种方式都会输出你预期的结果:
Array ( [0] => Array ( [apples] => 1 [pears] => 1 [oranges] => 1 [grapes] => [melons] => 1 [pineapples] => [bananas] => [lemons] => ) )
内容的提问来源于stack exchange,提问作者Fazberry
相关产品推荐
相关产品推荐

