多数组合并:相同键下price与qty求和,其余值取最后项
PHP数组动态合并需求及正确实现
需求说明
需要实现动态合并任意数量的PHP数组,合并规则如下:
- 对于拥有相同顶级键的元素:
price和qty字段的值转为数值后求和name、category等其他字段保留最后出现数组中的对应值
示例数组
<?php $arr1 = [ 51 => [ 'name' => 'p1', 'price' => '20', 'qty' => '10', 'category' => 'c1' ], 3 => [ 'name' => 'p2', 'price' => '10.50', 'qty' => '3', 'category' => 'c2' ] ]; $arr2 = [ 3 => [ 'name' => 'p3', 'price' => '23', 'qty' => '22', 'category' => 'c1' ], 102 => [ 'name' => 'p4', 'price' => '10.50', 'qty' => '8', 'category' => 'c2' ] ];
当前错误代码
mergeArrays(($arr1 + $arr2)); function mergeArrays($array) { $mergedArray = []; foreach ($array as $k => $arr) { foreach ($arr as $key => $value) { if (!isset($mergedArray[$key])) { $mergedArray[$k][$key] = $value; } else { $mergedArray[$key] += $value; } } } print_r($mergedArray); //return $mergedArray; }
当前代码输出
Array ( [51] => Array ( [name] => p1 [price] => 20 [qty] => 10 [category] => c1 ) [3] => Array ( [name] => p2 [price] => 10.50 [qty] => 3 [category] => c2 ) [102] => Array ( [name] => p4 [price] => 10.50 [qty] => 8 [category] => c2 ) )
期望输出结果
Array ( [51] => Array ( [name] => p1 [price] => 20 [qty] => 10 [category] => c1 ) [3] => Array ( [name] => p3 // 取最后出现数组的值 [price] => 33.50 // 求和结果 [qty] => 25 // 求和结果 [category] => c1 // 取最后出现数组的值 ) [102] => Array ( [name] => p4 [price] => 10.50 [qty] => 8 [category] => c2 ) )
解决方案
修改函数逻辑,支持接收任意数量的数组参数,按规则处理每个字段:
<?php function mergeArrays(...$arrays) { $merged = []; foreach ($arrays as $array) { foreach ($array as $key => $item) { // 顶级键已存在,处理求和与覆盖逻辑 if (isset($merged[$key])) { // price和qty转数值后求和 $merged[$key]['price'] = (float)$merged[$key]['price'] + (float)$item['price']; $merged[$key]['qty'] = (int)$merged[$key]['qty'] + (int)$item['qty']; // 其他字段覆盖为当前数组的值(保留最后出现的) foreach ($item as $field => $value) { if (!in_array($field, ['price', 'qty'])) { $merged[$key][$field] = $value; } } } else { // 顶级键不存在,直接赋值 $merged[$key] = $item; } } } return $merged; } // 调用示例 $result = mergeArrays($arr1, $arr2); print_r($result);
代码说明
- 使用
...$arrays语法接收任意数量的输入数组,实现动态合并 - 遍历每个输入数组的顶级键:
- 若键已存在:将
price转浮点、qty转整数后求和,其他字段直接覆盖为当前数组的对应值 - 若键不存在:直接将当前元素加入结果数组
- 若键已存在:将
- 返回符合规则的合并后数组
内容的提问来源于stack exchange,提问作者PЯINCƎ
相关产品推荐
相关产品推荐

