← PHP中的count():数一下数组里有多少东西 PHP中的array_slice():从数组里切出一段 →

PHP中的array_count_values():统计数组元素出现的频率

原创 2026-05-22 PHP 已有人查阅

有时候你需要知道一个数组里每个值出现了多少次。比如统计用户投票结果、分析日志中的状态码、统计文章中出现的关键词频率。

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数组的键名只能是整数或字符串,所以原数组的值也必须是整数或字符串。浮点数、布尔值、数组、对象都不能用。

个人经验分享

  1. 区分大小写

    $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);
  2. 处理大数组的性能
    array_count_values()的效率不错,但它需要遍历整个数组。对于几十万级别的数组没问题,上百万条数据可能会有内存压力。我遇到过统计500万条日志的情况,用这个函数直接内存溢出,后来改成了数据库聚合查询。

  3. 找出出现次数最多的值

    $counts = array_count_values($data);
    $max_count = max($counts);
    $most_frequent = array_keys($counts, $max_count);

    先用array_count_values()统计频率,再用max()找较大值,之后用array_keys()找到对应的原值。

  4. 什么时候用这个函数?

    • 统计问卷选项分布

    • 分析数组中的重复数据

    • 做简单的词频统计

    • 检查数据集中不同值的分布情况

示例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))

← PHP中的count():数一下数组里有多少东西 PHP中的array_slice():从数组里切出一段 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号