
本文介绍如何将 php 数组中以逗号分隔的复合键(如 'a,b')拆解,并将其对应值累加到各独立关键词(如 'a' 和 'b')上,最终得到按单个键归并统计的结果。
在实际开发中,尤其是处理标签、分类或多维度统计场景时,常会遇到类似这样的数组结构:
$arr = [
'A' => 5,
'B' => 1,
'A,B' => 5
];其语义是:关键词 A 出现了 5 次,B 出现了 1 次,而组合 A,B 同时出现(可理解为同时命中 A 和 B)共 5 次。因此,若需统计每个关键词的总覆盖次数,则 A 应为 5 + 5 = 10,B 应为 1 + 5 = 6。
实现该逻辑的核心思路是:
- 遍历原数组,对每个键执行 explode(',', $key) 拆分为子关键词;
- 对每个子关键词,将其对应值累加至结果数组中(初始化为 0 或原值);
- 使用引用传递(use (&$result))确保闭包内可修改外部变量。
以下是完整、健壮的实现代码:
立即学习“PHP免费学习笔记(深入)”;
$arr = ['A' => 5, 'B' => 1, 'A,B' => 5];
$result = [];
array_walk($arr, function ($value, $key) use (&$result) {
$subKeys = array_map('trim', explode(',', $key)); // 自动去除空格,增强鲁棒性
foreach ($subKeys as $subKey) {
if ($subKey === '') continue; // 跳过空键(如 ',A,' 拆出的空字符串)
$result[$subKey] = ($result[$subKey] ?? 0) + $value;
}
});
print_r($result);
// 输出:
// Array
// (
// [A] => 10
// [B] => 6
// )✅ 关键优化说明:
- 使用 $result[$subKey] ?? 0 替代 array_key_exists() 判断,语法更简洁、性能略优;
- array_map('trim', ...) 处理可能存在的空格(如 'A, B'),提升实用性;
- 显式跳过空字符串键,避免意外写入无效索引。
⚠️ 注意事项:
- 此方法假设键名格式规范(仅含逗号分隔的标识符),不适用于嵌套分隔符(如 'A,B,C' 已支持,但 'A|B,C' 需先预处理);
- 若原始数组存在重复单一键(如同时存在 'A' => 2 和 'A' => 3),PHP 会自动覆盖,建议确保键唯一;
- 如需支持大小写不敏感聚合(如 'a' 和 'A' 合并),可在 explode 后统一转为小写:strtolower($subKey)。
该方案简洁高效,适用于中小型数据集;若需处理超大规模数组或高频调用,可进一步封装为函数并添加类型声明(PHP 7.4+)以提升可维护性。











