
本文介绍一种高效方法:将含逗号分隔键(如 `'a,b'`)的关联数组,按各子键拆分并累加对应值,最终生成按单个键聚合的新数组。适用于关键词统计、标签计数等场景。
在实际开发中,我们常遇到一类“伪多维”结构的数组——键名本身是用逗号连接的多个标识符(如 'A,B'、'X,Y,Z'),而对应的值需按每个子标识符分别累加。例如原始数组:
$arr = ['A' => 5, 'B' => 1, 'A,B' => 5];
目标是将 'A,B' => 5 拆解为 'A' += 5 和 'B' += 5,最终得到:
['A' => 10, 'B' => 6]
实现的核心逻辑是:遍历原数组,对每个键执行 explode(',', $key) 拆分,再对每个子键累加其对应值。
以下是推荐的简洁实现(使用 array_walk + 引用传递):
立即学习“PHP免费学习笔记(深入)”;
$arr = ['A' => 5, 'B' => 1, 'A,B' => 5];
$result = [];
array_walk($arr, function ($value, $key) use (&$result) {
$subKeys = explode(',', $key);
foreach ($subKeys as $subKey) {
$subKey = trim($subKey); // 建议添加,兼容空格(如 'A, B')
if (isset($result[$subKey])) {
$result[$subKey] += $value;
} else {
$result[$subKey] = $value;
}
}
});
print_r($result);
// 输出:Array ( [A] => 10 [B] => 6 )✅ 关键要点说明:
- 使用 use (&$result) 确保闭包内可修改外部 $result 数组;
- trim($subKey) 防止因键中存在空格(如 'A, B')导致生成 ' B' 这类意外键名;
- 推荐用 isset() 替代 array_key_exists(),语义更清晰且性能略优(二者在此场景效果一致);
- 若原始数组可能含数字键或空键,建议提前过滤:if (!is_string($key) || $key === '') continue;
? 扩展提示:
如需支持更复杂分隔(如分号、竖线)或嵌套结构,可将 explode() 替换为正则分割 preg_split('/[,;\|]+/', $key, -1, PREG_SPLIT_NO_EMPTY),并确保启用 PREG_SPLIT_NO_EMPTY 忽略空项。
该方案简洁、可读性强,无需额外函数封装,适合直接集成到统计类或数据预处理流程中。











