在php开发中,统计数组中所有值出现的次数时,array_count_values函数是官方提供的便捷工具,它可以遍历数组并将每个值作为新数组的键,出现次数作为对应的值返回。不过实际使用中,关联数组的场景和空值处理是需要重点注意的部分。

array_count_values函数基本用法
array_count_values函数的语法非常简单,仅接收一个数组作为参数,返回统计后的关联数组。需要注意的是,该函数仅统计数组的值,不会关注原数组的键名,原数组的键名无论是什么类型,都不会影响统计结果。
下面是一个基础的使用示例:
<?php // 定义一个普通索引数组 $normalArr = [1, 2, 2, 3, 3, 3, 'a', 'a', 'b']; // 调用array_count_values统计值出现次数 $countResult = array_count_values($normalArr); // 打印结果 print_r($countResult); ?>
上述代码的输出结果为:
Array
(
[1] => 1
[2] => 2
[3] => 3
[a] => 2
[b] => 1
)
关联数组的计数逻辑
对于关联数组,array_count_values同样只关注数组的值,键名会被完全忽略。比如下面的关联数组示例:
<?php
// 定义关联数组
$assocArr = [
'id' => 10,
'age' => 20,
'score' => 10,
'level' => 20,
'name' => 'test'
];
// 统计值出现次数
$assocCount = array_count_values($assocArr);
print_r($assocCount);
?>
输出结果为:
Array
(
[10] => 2
[20] => 2
[test] => 1
)
可以看到,原数组的键名id、age等都没有出现在结果中,仅统计了值10、20、test的出现次数。
空值过滤的必要性
array_count_values函数有一个限制:数组的值必须是整型或者字符串类型,如果出现null、数组、对象等类型的值,会直接抛出警告并返回false。因此在实际开发中,统计前过滤空值和其他非法类型的值是很有必要的。
方法一:使用array_filter过滤空值
array_filter函数默认会过滤掉所有等价于false的值,包括null、空字符串、0、false等,如果需要保留0这类合法值,可以自定义过滤回调。
<?php
// 包含空值的数组
$arrWithNull = [1, null, 2, '', 2, null, 3, false];
// 过滤空值,保留0的话可以调整回调
$filteredArr = array_filter($arrWithNull, function($val) {
// 排除null和空字符串,保留0、false等合法值
return !is_null($val) && $val !== '';
});
// 重新索引数组,避免原键名影响
$filteredArr = array_values($filteredArr);
// 统计次数
$countRes = array_count_values($filteredArr);
print_r($countRes);
?>
方法二:手动遍历过滤非法值
如果需要更精细的控制,比如排除null同时保留其他所有合法值,可以手动遍历数组筛选:
<?php
$arr = [1, null, 2, 'hello', null, 2, [1,2], 3];
$validVals = [];
foreach ($arr as $val) {
// 仅保留整型和字符串类型的值,排除null、数组等
if (is_int($val) || is_string($val)) {
$validVals[] = $val;
}
}
$countRes = array_count_values($validVals);
print_r($countRes);
?>
上述代码会过滤掉null和数组元素,仅统计1、2、hello、2、3的出现次数,输出结果为:
Array
(
[1] => 1
[2] => 2
[hello] => 1
[3] => 1
)
注意事项总结
- array_count_values仅统计数组的值,与原数组的键名无关,关联数组和非关联数组的统计逻辑一致。
- 数组值只能为整型或字符串,否则会报错,统计前务必过滤空值和非法类型。
- 过滤空值时根据业务需求选择array_filter或手动遍历,避免误过滤合法的业务值。
- 如果统计后需要按照出现次数排序,可以配合arsort函数对结果数组进行降序排列。
array_count_valuesphp关联数组数组计数空值过滤修改时间:2026-07-04 14:45:26