
本文介绍如何在 PHP 7.3+ 中高效统计多维数组中某一固定索引(如 [3])上各字符串值的出现次数,并生成键为值、值为计数的关联数组。
本文介绍如何在 php 7.3+ 中高效统计多维数组中某一固定索引(如 `[3]`)上各字符串值的出现次数,并生成键为值、值为计数的关联数组。
在处理结构化数据(如从 CSV、数据库查询或日志解析得到的二维数组)时,常需按某列(即某索引位置)对数据进行分组统计。例如,给定一个由多条记录组成的数组,每条记录是索引数组,我们需要快速统计第 4 列(索引 3)中每个唯一值出现的频次。
PHP 提供了简洁而强大的内置函数组合来完成该任务:array_map() 提取目标列,array_count_values() 统计频次。整个过程无需显式循环,代码清晰且性能优良。
以下是一个完整可运行的示例:
<?php $data = [
['CHICAGO', '14', 'MUFFIN A LINE', 'MUFA-D', 'Arm Bearings - Check for play, lubricate if needed.'],
['CHICAGO', '14', 'MUFFIN A LINE', 'MUFA-D', 'Linkage - Check for wear and broken links.'],
['MEMPHIS', '05', 'BREADING LINE 1', 'BRD1-IS', 'Gear Box oil level'],
['MEMPHIS', '05', 'BREADING LINE 1', 'BRD1-IS', 'Bearings visual inspection'],
['MEMPHIS', '05', 'BREADING LINE 1', 'BRD1-IS', 'Electrical Plug condition'],
['CHICAGO', '02', 'JBC LINE 2', 'JBC-BAK-B', 'Plate separator shaft']
];
// 提取每行索引为 3 的值
$columnValues = array_map(function($row) {
return $row[3] ?? null; // 使用 null 合并符避免未定义索引警告
}, $data);
// 统计频次(自动忽略 null 值)
$counts = array_count_values($columnValues);
print_r($counts);
?>
输出结果为:
Array
(
[MUFA-D] => 2
[BRD1-IS] => 3
[JBC-BAK-B] => 1
)
✅ 关键要点说明:
- array_map() 遍历原始数组,对每一子数组执行匿名函数,提取 $row[3];使用空合并操作符 ?? null 可安全处理缺失索引,防止 Notice 错误。
- array_count_values() 要求输入为一维数组,它将输入值作为新数组的键,对应出现次数作为值——天然适配本场景。
- 若需排除空值或特定无效值(如 'N/A'、''),可在 array_map 后添加 array_filter() 过滤:
$columnValues = array_filter($columnValues, function($v) { return $v !== '' && $v !== null; });
⚠️ 注意事项:
- array_count_values() 对非标量值(如数组、对象)会抛出 Warning,因此务必确保提取的 $row[3] 是字符串或数字类型;
- 若原始数据存在大小写混用(如 'MUFA-d' 和 'MUFA-D'),需统一转换:strtoupper($row[3]) 或 strtolower($row[3]);
- 在大数据量场景下(>10 万行),该方案仍保持良好性能,因其时间复杂度为 O(n),且全部基于 C 实现的底层函数。
综上,结合 array_map 与 array_count_values 是 PHP 中统计多维数组指定列频次最简洁、健壮且符合现代 PHP 风格的解决方案。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











