
本文详解如何在 php 中准确统计数组中各元素的出现次数,并仅提取重复元素(频次 ≥ 2)构成关联数组,涵盖标准方法、常见逻辑错误剖析及生产环境推荐写法。
本文详解如何在 php 中准确统计数组中各元素的出现次数,并仅提取重复元素(频次 ≥ 2)构成关联数组,涵盖标准方法、常见逻辑错误剖析及生产环境推荐写法。
在 PHP 开发中,统计数组元素频次是高频需求,尤其当需识别并量化重复值时(如日志分析、数据清洗或报表生成)。给定数组 $arr = [1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10],目标是输出仅含重复项及其精确出现次数的关联数组:[2 => 4, 5 => 4, 9 => 2, 10 => 3]。
你原始代码的核心问题在于双重循环逻辑与计数器重置机制冲突:内层循环对每个 $arr[i] 重复扫描后续元素,但 $count 在 else 分支中被频繁重置为 1,导致计数无法累积;同时 !in_array($arr[$j], $duplicates) 仅控制键的首次写入,却未隔离不同元素的独立计数上下文——最终 2 和 5 的计数被截断,而 10 因循环顺序巧合被多次叠加,结果失真。
✅ 推荐解法:使用单次遍历 + 关联数组累加(时间复杂度 O(n),简洁可靠)
$arr = [1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10];
$counters = [];
foreach ($arr as $value) {
if (isset($counters[$value])) {
$counters[$value]++;
} else {
$counters[$value] = 1;
}
}
// 过滤出重复项(出现次数 ≥ 2)
$duplicates = array_filter($counters, function($count) {
return $count >= 2;
});
print_r($duplicates);
输出:
Array
(
[2] => 4
[5] => 4
[9] => 2
[10] => 3
)
? 进阶优化:利用 PHP 内置函数一步到位
若无需中间频次表,可直接结合 array_count_values() 与 array_filter():
$arr = [1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10];
$duplicates = array_filter(
array_count_values($arr),
fn($count) => $count >= 2
);
print_r($duplicates);
⚠️ 注意事项:
-
array_count_values()要求数组元素为标量类型(int/string/bool/null),不支持对象或数组; - 若需保持原始数组中重复元素的首次出现顺序,
array_keys($duplicates)可获取键列表,再按原数组索引排序; - 避免在循环中使用
in_array()或嵌套循环处理大数据集——其 O(n²) 复杂度在万级数据下将显著拖慢性能。
总结:统计频次应优先采用哈希映射思想(PHP 关联数组天然支持),单次遍历即可完成;过滤重复项宜用 array_filter() 显式声明业务规则,代码更清晰、健壮且易于维护。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











