PHP合并数组并统计频次常用array_merge()加array_count_values(),但需注意键名处理及值类型限制;关联数组应先用array_values()提取值;含复杂类型时需手动循环+serialize()统计。

PHP中合并两个数组并统计每个值出现次数,常用 array_merge() 拼接数组,再用 array_count_values() 统计频次。注意这两个函数对键名和值类型有要求,需根据实际数据类型选择合适方法。
基础方法:直接合并 + 频次统计
适用于索引数组或关联数组的值(非键名)需要去重计数的场景:
- 先用
array_merge($arr1, $arr2)合并,注意它会重置数字键、保留字符串键(同名键后者覆盖前者) - 再对合并后的数组调用
array_count_values($merged),该函数只接受一维、值为字符串或整数的数组 - 若原数组含布尔、null、浮点数或对象,
array_count_values()会报错或自动类型转换(如true→1,false→0)
示例:
$a = [1, 2, 2]; $b = [2, 3, 3, 3]; $merged = array_merge($a, $b); // [1,2,2,2,3,3,3] $result = array_count_values($merged); // [1=>1, 2=>3, 3=>3]
处理关联数组的值(忽略键名)
如果两个数组是关联形式,但你只关心“所有值”的出现次数(不区分来自哪个键),可先提取值再合并:
立即学习“PHP免费学习笔记(深入)”;
- 用
array_values($arr1)和array_values($arr2)提取纯值数组,避免键名干扰 - 再执行
array_merge()和array_count_values() - 这样即使原数组有相同键名(如
['a'=>1, 'b'=>2]和['x'=>1, 'y'=>2]),也不会因键冲突丢失数据
支持混合类型或复杂结构(手动统计)
当数组含数组、对象、null 或需自定义比较逻辑时,array_count_values() 不适用,改用循环累加:
- 初始化一个空结果数组
$counts = [] - 遍历两个数组的所有值,用
serialize($value)作为键(可精确区分 null/0/false 等) - 或用
json_encode($value, JSON_THROW_ON_ERROR)(需 PHP ≥7.3,且值可 JSON 序列化) - 每次遇到值,对应键的计数 +1
示例(兼容 null 和数组):
$counts = [];
foreach (array_merge($arr1, $arr2) as $v) {
$key = serialize($v);
$counts[$key] = ($counts[$key] ?? 0) + 1;
}
// 还原时可用 array_map('unserialize', array_keys($counts))
去重后合并再统计(按需)
如果目标是“两个数组并集中的每个值出现总次数”,而非简单拼接,需先去重再分别计数:
- 用
array_unique(array_merge($arr1, $arr2))获取所有不重复值 - 对每个唯一值,用
count(array_keys($arr1, $val, true)) + count(array_keys($arr2, $val, true))分别统计在两数组中出现次数 - 适合需严格区分来源、或合并前需去重的业务逻辑



















