PHP 8.0 中合并多维数组并按相同键求和需自定义递归函数,核心是区分数值与数组类型、同为数值则相加、同为数组则递归合并、仅单边存在则保留原值,并注意数字索引需按业务键(如 pid)分组累加。

PHP 8.0 中合并多维数组并按相同键(尤其是嵌套的同名键)求和,不能直接用 array_merge 或 +,因为它们会覆盖而非累加。核心思路是:递归遍历、识别数值键/字符串键、对齐结构、遇到数字则相加,遇到数组则递归合并。
使用自定义递归合并+求和函数
这是最通用、可控的方式,适用于任意深度的关联多维数组:
- 遍历第一个数组,逐个键处理;
- 若当前键在第二个数组中也存在,且两者都是数值 → 直接相加;
- 若两者都是数组 → 递归调用自身合并;
- 若只在一个数组中存在 → 保留原值;
- 注意区分
is_numeric($val)和is_int($val) || is_float($val),推荐用后者避免字符串数字(如"123")被误加。
示例代码:
function array_sum_recursive(array $a, array $b): array
{
$result = $a;
foreach ($b as $key => $value) {
if (isset($a[$key]) && is_array($a[$key]) && is_array($value)) {
$result[$key] = array_sum_recursive($a[$key], $value);
} elseif (isset($a[$key]) && (is_int($a[$key]) || is_float($a[$key])) && (is_int($value) || is_float($value))) {
$result[$key] = $a[$key] + $value;
} else {
$result[$key] = $value;
}
}
return $result;
}
// 使用示例
$arr1 = ['sales' => 100, 'items' => ['A' => 5, 'B' => 3]];
$arr2 = ['sales' => 200, 'items' => ['A' => 2, 'C' => 7]];
$merged = array_sum_recursive($arr1, $arr2);
// 结果:['sales' => 300, 'items' => ['A' => 7, 'B' => 3, 'C' => 7]]
处理含数字索引的多维数组(如订单列表)
如果数组是「列表型」嵌套(例如多个订单,每个订单有 amount),需先按业务逻辑归类(如按 product_id 分组),再求和:
- 不建议直接递归合并数字键,因为
[0] + [0]易错位; - 先用
array_reduce或循环提取公共维度(如id或name); - 再用
array_key_exists或??合并同 key 的数值字段。
示例(合并两个订单明细,按商品 ID 汇总数量):
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
$orders1 = [['pid' => 'p1', 'qty' => 2], ['pid' => 'p2', 'qty' => 1]];
$orders2 = [['pid' => 'p1', 'qty' => 3], ['pid' => 'p3', 'qty' => 5]];
$all = array_merge($orders1, $orders2);
$summed = [];
foreach ($all as $item) {
$pid = $item['pid'];
$summed[$pid]['qty'] = ($summed[$pid]['qty'] ?? 0) + $item['qty'];
}
// $summed = ['p1'=>['qty'=>5], 'p2'=>['qty'=>1], 'p3'=>['qty'=>5]]
借助 PHP 8.0+ 新特性简化(属性提升 + match 表达式)
虽不直接用于合并,但可让逻辑更清晰。例如封装为工具类,用 match 区分数据类型:
- 用
match (true)替代长 if-else 判断类型; - 配合联合类型声明(
int|float|array)提升可读性; - 注意:PHP 8.0 的
match不支持数组作为条件,仍需用is_array()预判。
小技巧:若数组结构固定(如都是二维、键名已知),可用 array_map 配合解构快速求和:
// 假设 $data1 和 $data2 都是 ['A'=>10, 'B'=>20] 格式
$result = array_map(
fn($x, $y) => $x + $y,
$data1,
$data2
);
避坑提醒
常见错误要避开:
-
别用
array_merge_recursive—— 它会把同键数值转成数组(如['a'=>1] + ['a'=>2]变成['a'=>[1,2]]); -
注意 null / false / string 数字 ——
is_numeric('0')为 true,但你可能不想加字符串; -
键名大小写敏感 ——
'Sales'和'sales'被视为不同键; -
空数组参与时逻辑要补全 —— 递归函数开头可加
if (!$a) return $b; if (!$b) return $a;。
不复杂但容易忽略细节,按需选择递归函数或分组累加,关键在明确「哪些键要对齐」「哪些值要相加」。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










