有时候你需要知道一个数组里每个值出现了多少次。比如统计用户投票结果、分析日志中的状态码、统计文章中出现的关键词频率。
array_count_values()就是干这个的——它遍历数组,数一数每个值出现了几回,然后返回一个新数组:原来的值变成键,出现次数变成值。
语法格式
array_count_values(array $array): array
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| array | 要统计的数组 | 必填 |
返回值: 一个关联数组,键是原数组的元素值,值是该元素出现的次数。
限制: 原数组的值必须是字符串或整数。传浮点数、布尔值或数组进去会报错。
示例1:基础用法
<?php
$votes = ["A", "B", "A", "C", "B", "A", "D"];
$result = array_count_values($votes);
print_r($result);
?>
输出:
Array
(
[A] => 3
[B] => 2
[C] => 1
[D] => 1
)
A出现了3次,B出现了2次,C和D各1次。一目了然。
示例2:统计整数数组
<?php
$scores = [85, 92, 85, 78, 92, 85, 88, 92];
$frequency = array_count_values($scores);
print_r($frequency);
?>
输出:
Array
(
[85] => 3
[92] => 3
[78] => 1
[88] => 1
)
85分出现了3次,92分出现了3次。分析考试成绩分布情况很方便。
示例3:混合字符串和数字
<?php
$data = ["PHP", 2024, "PHP", "Java", 2024, 2024, "Python"];
$counts = array_count_values($data);
print_r($counts);
?>
输出:
Array
(
[PHP] => 2
[2024] => 3
[Java] => 1
[Python] => 1
)
字符串和整数可以混在一起,PHP会自动区分类型。"2024"和2024不一样,一个是字符串一个是整数,会被当成两个不同的值来统计。
示例4:什么情况会报错
<?php
// 浮点数会导致错误
$bad_data = [1.5, 2.5, 1.5];
$result = array_count_values($bad_data); // 报错:浮点数不能作为键名
// 布尔值也会报错
$bad_data2 = [true, false, true];
$result2 = array_count_values($bad_data2); // 报错
?>
原因: 返回结果数组的键名来自原数组的值。PHP数组的键名只能是整数或字符串,所以原数组的值也必须是整数或字符串。浮点数、布尔值、数组、对象都不能用。
个人经验分享
-
区分大小写
$words = ["PHP", "php", "Php", "PHP"]; $result = array_count_values($words); // 结果:["PHP" => 2, "php" => 1, "Php" => 1]PHP是区分大小写的,"PHP"和"php"算两个不同的值。如果需要不区分大小写统计,先把数组统一转成小写:
$words = array_map('strtolower', $words); $result = array_count_values($words); -
处理大数组的性能
array_count_values()的效率不错,但它需要遍历整个数组。对于几十万级别的数组没问题,上百万条数据可能会有内存压力。我遇到过统计500万条日志的情况,用这个函数直接内存溢出,后来改成了数据库聚合查询。 -
找出出现次数最多的值
$counts = array_count_values($data); $max_count = max($counts); $most_frequent = array_keys($counts, $max_count);先用array_count_values()统计频率,再用max()找较大值,之后用array_keys()找到对应的原值。
-
什么时候用这个函数?
-
统计问卷选项分布
-
分析数组中的重复数据
-
做简单的词频统计
-
检查数据集中不同值的分布情况
-
示例5:代码号学习编程场景
<?php
// 统计各学生的出勤次数(用状态码表示)
$attendance = [
"代码号001" => "present", "代码号002" => "absent", "代码号003" => "present",
"代码号004" => "present", "代码号005" => "late", "代码号006" => "absent",
"代码号007" => "present", "代码号008" => "present", "代码号009" => "late",
"代码号010" => "present"
];
$stats = array_count_values($attendance);
echo "出勤统计:\n";
echo "全勤:" . ($stats["present"] ?? 0) . "人\n";
echo "迟到:" . ($stats["late"] ?? 0) . "人\n";
echo "缺勤:" . ($stats["absent"] ?? 0) . "人\n";
?>
输出:
出勤统计:
全勤:6人
迟到:2人
缺勤:2人
示例6:手工实现相同的功能
<?php
// 不用array_count_values,自己用循环实现
function my_array_count_values($arr) {
$result = [];
foreach ($arr as $value) {
if (!is_string($value) && !is_int($value)) {
trigger_error("只支持字符串和整数", E_USER_WARNING);
return false;
}
if (isset($result[$value])) {
$result[$value]++;
} else {
$result[$value] = 1;
}
}
return $result;
}
$test = ["apple", "banana", "apple", "orange", "banana", "apple"];
print_r(my_array_count_values($test));
?>
输出和array_count_values()一样。内置函数的好处是C语言实现,速度更快。
本节课程知识要点
-
array_count_values()统计数组中每个值出现的次数 -
返回新数组:原值 → 出现次数
-
原数组的值只能是整数或字符串,否则报错
-
区分大小写,“PHP”和“php”会被分别统计
-
从PHP 4.0开始可用
-
结合
arsort()可以按频率从高到低排序:arsort(array_count_values($data))