
本文介绍一种高效方法:将形如 `[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); 即可。
该方案逻辑清晰、无冗余遍历,精准解决“按值分组 + 去重计键”的核心需求。










