如何将嵌套数组按值聚合并统计唯一键的数量

11次阅读

如何将嵌套数组按值聚合并统计唯一键的数量

本文介绍一种高效方法:将形如 `[key => value]` 的多个单元素关联数组,按 `value` 分组,统计每组中不同 `key` 出现的去重数量,最终得到 `[‘value’ => count_of_unique_keys]` 的汇总结果。

在实际开发中(例如日志分析、用户行为归类或商品标签统计),我们常遇到一类结构松散但语义明确的数据:每个子数组仅含一个键值对,其中 键(key)代表实体标识(如用户ID、商品SKU)值(value)代表分类标签(如等级、状态、类型)。目标不是简单计数,而是统计“每个标签下有多少个不重复的实体”。

上述问题中的原始数据正是如此:

  • [1 => 7] 表示 ID=1 的记录属于类别 7;
  • [4 => 7] 出现两次,但只应计为类别 7 下的 1 个唯一 ID;
  • 最终需得出:类别 7 共覆盖 6 个不同 ID(1,2,3,4,5,6),类别 8 覆盖 2 个(1,2)。

以下是推荐的实现逻辑(php):

 7], [2 => 7], [3 => 7], [4 => 7], [4 => 7],     [5 => 7], [5 => 7], [6 => 7], [1 => 8], [2 => 8], ];  // 步骤1:按 value 分组,收集所有对应的 key $grouped = []; foreach ($data as $item) {     $value = reset($item); // 获取当前子数组的唯一值(如 7 或 8)     $key   = key($item);   // 获取当前子数组的唯一键(如 1 或 2)     $grouped[$value][] = $key; }  // 步骤2:对每个 value 对应的 key 数组去重 $uniqueKeys = []; foreach ($grouped as $val => $keys) {     $uniqueKeys[$val] = array_unique($keys); }  // 步骤3:统计每个 value 下的唯一 key 数量 $result = []; foreach ($uniqueKeys as $val => $keys) {     $result[$val] = count($keys); }  print_r($result); // 输出:Array ( [7] => 6 [8] => 2 )

关键点说明

  • reset($item) 和 key($item) 安全获取单元素关联数组的值与键(无需 current()/key() 配合 each(),避免指针副作用);
  • 使用 array_unique() 确保同一 ID 在同一类别中多次出现仅计 1 次;
  • 整个流程时间复杂度为 O(n),空间可控,适合千级以内数据;若数据量极大(如 >10⁵),建议改用数据库 GROUP BY value, COUNT(DISTINCT key) 直接聚合。

? 进阶提示
如需同时返回具体 ID 列表(而不仅是数量),可直接使用 $uniqueKeys 数组;若需按数量降序排列结果,添加 uasort($result, fn($a, $b) => $b $a); 即可。

该方案逻辑清晰、无冗余遍历,精准解决“按值分组 + 去重计键”的核心需求。

text=ZqhQzanResources