PHP:如何高效获取数组中重复值对应的键并分组存储
高效获取PHP数组中重复值的所有键分组
这是一个很常见的PHP数组处理需求,最高效的实现方式是一次遍历构建值与对应键列表的映射,再过滤出包含多个键的分组,具体代码和解释如下:
核心实现代码
$a = array( "0" => "red", "1" => "green" , "2" => "red" , "3" => "blue", "4" => "blue", "5" => "blue" ); // 1. 遍历原数组,构建「值 → 对应所有键的列表」的映射 $valueKeyMap = []; foreach ($a as $key => $value) { $valueKeyMap[$value][] = $key; } // 2. 过滤掉仅包含单个键的分组,只保留重复值对应的键列表 $duplicateKeyGroups = array_filter($valueKeyMap, function($keys) { return count($keys) > 1; }); // 可选:重置结果数组的索引为连续数字(和示例结构完全匹配) $duplicateKeyGroups = array_values($duplicateKeyGroups); // 输出结果 print_r($duplicateKeyGroups);
为什么这是最高效的方法?
- 时间复杂度最优:整个过程只需要遍历原数组一次(O(n)复杂度),后续的过滤和索引重置都是线性操作,没有嵌套循环。相比其他方法(比如先取唯一值再逐个遍历找键,时间复杂度为O(n*m),m是唯一值数量),在数组规模较大时效率差异会非常明显。
- 空间开销合理:用一个临时数组存储映射关系,空间复杂度为O(n),这是实现需求必须的开销,没有冗余存储。
输出结果说明
运行上述代码后,会得到完全符合你期望的结构:
Array ( [0] => Array ( [0] => 0 [1] => 2 ) [1] => Array ( [0] => 3 [1] => 4 [2] => 5 ) )
内容的提问来源于stack exchange,提问作者Andreasschnetzer
相关产品推荐
相关产品推荐

