
本文介绍在 PHP 中高效统计二维数组内各子数组重复次数的方法,核心思路是将不可哈希的子数组通过 json_encode 转为唯一字符串键,再结合 array_count_values 实现频次统计。
本文介绍在 php 中高效统计二维数组内各子数组重复次数的方法,核心思路是将不可哈希的子数组通过 json_encode 转为唯一字符串键,再结合 array_count_values 实现频次统计。
在 PHP 中,原生数组(尤其是多维数组)无法直接作为关联数组的键使用,因此不能像处理标量值那样直接用 $count[$item]++ 统计子数组频次——这会导致 “Array to string conversion” 警告或逻辑错误。上述代码中 if(!isset($count_array[$item])) 实际会失败,因为数组不能作为数组键。
✅ 正确且简洁的解决方案是:先序列化子数组,再计数。推荐使用 json_encode() 将每个子数组转换为标准化、可比较的 JSON 字符串(注意:它能准确保留数字类型和顺序,且对空格不敏感),然后用 array_count_values() 进行高频统计。
以下是完整、健壮的实现代码:
$array = [
[121,159,196], [121,159,196], [120,158,195],
[119,157,194], [119,157,194], [121,159,196],
// ……(其余数据同题)
];
// 步骤1:将每个子数组转为规范 JSON 字符串(确保顺序与类型一致)
$encoded = array_map('json_encode', $array);
// 步骤2:统计各字符串出现次数
$count = array_count_values($encoded);
// 步骤3(可选):还原为「子数组 ⇒ 次数」的易读结构
$result = [];
foreach ($count as $json => $times) {
$result[json_decode($json, true)] = $times;
}
// 输出示例:查看 [121,159,196] 出现了多少次
echo "Count of [121,159,196]: " . ($count[json_encode([121,159,196])] ?? 0) . "\n";
// 输出:Count of [121,159,196]: 8 (依实际数据而定)
? 注意事项:
-
json_encode()比serialize()更安全:它不包含 PHP 特有结构(如引用标识),跨平台兼容性更好,且对整数/浮点数类型处理更稳定; - 若子数组含非 UTF-8 字符或资源类型,请先清洗数据,否则
json_encode()可能返回false; - 如需保持结果按原始数组顺序排序,可在统计后使用
uksort()或array_keys($array)做索引映射; - 对超大数组(>10万项),建议启用 OPcache 并避免重复
json_decode;生产环境可缓存$encoded结果以提升性能。
该方法时间复杂度为 O(n),空间效率高,是处理矩阵型数组频次统计的标准实践。










