PHP是否有单命令实现同键数组合并并求和对应值?
嵌套二维数组按键合并并求和的实现方案
嘿,刚好碰到过类似的需求!很遗憾的是,PHP里并没有原生的单条命令能直接实现这种嵌套二维数组的按键合并+数值求和操作——毕竟这个需求要处理两层维度的键匹配和数值累加,原生函数大多只针对单层数组或者简单的合并场景。不过我们可以用简洁的遍历写法或者函数组合来实现,先看看你给出的示例数组:
原始数组1:
Array ( [2017-03-01] => Array ( [apples] => 2 [bananas] => 1 ) [2017-03-02] => Array ( [apples] => 3 [bananas] => 6 ) [2017-03-03] => Array ( [apples] => 0 [bananas] => 4 ) )
原始数组2:
Array ( [2017-03-01] => Array ( [apples] => 3 [bananas] => 2 ) [2017-03-02] => Array ( [apples] => 4 [bananas] => 7 ) [2017-03-03] => Array ( [apples] => 1 [bananas] => 5 ) )
方案一:直观遍历实现(最易维护)
这是最直接的写法,逻辑清晰,适合后续调试和修改:
$array1 = [ '2017-03-01' => ['apples' => 2, 'bananas' => 1], '2017-03-02' => ['apples' => 3, 'bananas' => 6], '2017-03-03' => ['apples' => 0, 'bananas' => 4] ]; $array2 = [ '2017-03-01' => ['apples' => 3, 'bananas' => 2], '2017-03-02' => ['apples' => 4, 'bananas' => 7], '2017-03-03' => ['apples' => 1, 'bananas' => 5] ]; // 以第一个数组为结果基础 $result = $array1; // 遍历第二个数组的每个日期和水果数据 foreach ($array2 as $date => $fruits) { foreach ($fruits as $fruit => $count) { // 用null合并运算符处理可能不存在的键,避免报错 $result[$date][$fruit] = ($result[$date][$fruit] ?? 0) + $count; } } print_r($result);
执行后就能得到你期望的结果:
Array ( [2017-03-01] => Array ( [apples] => 5 [bananas] => 3 ) [2017-03-02] => Array ( [apples] => 7 [bananas] => 13 ) [2017-03-03] => Array ( [apples] => 1 [bananas] => 9 ) )
方案二:函数组合实现(更简洁)
如果想追求更“函数式”的写法,可以用array_merge_recursive结合array_map来实现,本质还是封装了遍历逻辑,但代码更紧凑:
$array1 = [/* 你的数组1内容 */]; $array2 = [/* 你的数组2内容 */]; // 先递归合并数组,相同键的数值会被转为数组 $merged = array_merge_recursive($array1, $array2); // 遍历处理每个日期下的水果数据,对数组类型的数值求和 $result = array_map(function($dateData) { return array_map(function($values) { return is_array($values) ? array_sum($values) : $values; }, $dateData); }, $merged); print_r($result);
总结
没有真正意义上的“单条命令”能一步完成这个需求,因为涉及到嵌套层级的键匹配和数值累加,必须要做层级遍历处理。上面两种方案各有优劣:第一种逻辑直观,容错性强,适合复杂场景;第二种写法简洁,适合数组结构规范统一的场景。
内容的提问来源于stack exchange,提问作者Imnotapotato
相关产品推荐
相关产品推荐

