PHP 数组键名拆分并按子键聚合计数教程

本文介绍如何将 php 关联数组中以逗号分隔的复合键(如 'a,b')自动拆解,并将其对应值累加到各子键(如 'a' 和 'b')上,最终生成按原子键聚合的统计数组。

在实际开发中,尤其是处理标签、分类或关键词统计时,常会遇到键名本身携带多维语义的情况。例如原始数组 ['A' => 5, 'B' => 1, 'A,B' => 5] 表示:单独出现 A 的频次为 5,单独出现 B 的频次为 1,而 A 与 B 同时出现(组合)的频次为 5。若需统计每个关键词的总出现次数(无论是否组合),则需将 'A,B' => 5 拆分为 'A' += 5 和 'B' += 5,最终得到 ['A' => 10, 'B' => 6]。

实现该逻辑的核心思路是:遍历原数组,对每个键执行 explode(',', $key) 拆分,再将对应值累加至结果数组中对应子键下。推荐使用 array_walk() 配合引用传递(use (&$result))确保结果可累积更新:

$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')
        $result[$subKey] = ($result[$subKey] ?? 0) + $value;
    }
});

print_r($result);
// 输出:
// Array
// (
//     [A] => 10
//     [B] => 6
// )

关键优化点说明:

  • 使用 $result[$subKey] ?? 0 替代 array_key_exists() 判断,更简洁且支持 PHP 7.0+;
  • trim($subKey) 可稳健处理带空格的键(如 'A, B' 或 'A ,B');
  • 若需保持键名顺序或排除重复键(如 'A,A,B'),可在 foreach 内加 array_unique($subKeys) 去重;
  • 对于大规模数据,建议预先校验 $key 是否为字符串,避免 explode() 在非字符串键上触发警告。

该方法轻量、无依赖、语义清晰,适用于日志分析、标签云统计、多选筛选聚合等典型场景。

立即学习“PHP免费学习笔记(深入)”;