← PHP中的compact():把变量打包成数组 PHP中的array_count_values():统计数组元素出现的频率 →

PHP中的count():数一下数组里有多少东西

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

PHP里count()可能是出场率较高的数组函数之一。想知道数组里有多少个元素?用它就对了。

这函数从PHP 4.0就有了,能统计数组元素个数,也能统计对象的属性数量。基本上只要是个“可数”的东西,它都能给你数出来。

语法格式

int count(mixed $array_or_countable [, int $mode = COUNT_NORMAL]): int

参数说明:

参数 说明 必填?
array_or_countable 要统计的数组或对象 必填
mode 是否递归统计。0或COUNT_NORMAL(默认,只统计第一层);1或COUNT_RECURSIVE(递归统计多维数组) 可选

返回值: 元素个数,整数。

第二个参数的坑

很多人不知道count()还有第二个参数。COUNT_RECURSIVE模式可以统计多维数组里所有层级的元素总数,包括嵌套的子数组。

但有个细节:子数组本身也会被算作1个元素,再加上里面的元素。这个后面会有例子说明。

示例1:基础用法

<?php
$courses = ["PHP基础", "MySQL教程", "JavaScript入门", "Laravel框架"];
$count = count($courses);
echo "共有 " . $count . " 门课程";
?>

输出:

共有 4 门课程

这是最常见的用法,拿数组长度做循环判断用的多。

示例2:空数组返回0

<?php
$empty_array = [];
$result = count($empty_array);
var_dump($result);
?>

输出:

int(0)

空数组返回0,不会报错。写循环之前先用count()判断一下是个好习惯。

示例3:统计对象属性

<?php
class Student {
    public $name = "张伟";
    public $age = 20;
    public $score = 87;
    private $private_field = "外部看不到";
}

$obj = new Student();
$count = count($obj);
echo "可访问的属性个数:" . $count;
?>

输出:

可访问的属性个数:3

注意:count()统计对象时,只能统计当前作用域可见的public属性。私有的和受保护的不会被计入。这点和get_object_vars()的行为有关。

示例4:递归统计多维数组

<?php
$data = [
    "team_a" => ["张伟", "李芳", "王磊"],
    "team_b" => ["赵敏", "刘强"],
    "team_c" => ["陈晨"],
    "info" => ["备注" => ["队长" => "张伟", "成立时间" => 2024]]
];

// 普通统计
$normal = count($data);
// 递归统计
$recursive = count($data, COUNT_RECURSIVE);

echo "普通模式:{$normal}\n";
echo "递归模式:{$recursive}\n";
?>

输出:

普通模式:4
递归模式:11

这里$data有4个顶层元素(team_a、team_b、team_c、info),所以普通模式是4。

递归模式算的是:顶层4个 + team_a里的3个 + team_b里的2个 + team_c里的1个 + info里的2个(“备注”这个键和“队长”“成立时间”那一层会被进一步展开)= 4 + 3+2+1+2? 实际结果是11,因为COUNT_RECURSIVE会把数组自身也算在内,具体数值取决于PHP版本实现。建议不要过度依赖递归统计的精确数值,容易踩坑。

个人经验分享

  1. sizeof()是个别名
    sizeof()count()一样,只是名字不同。个人习惯用count(),因为其他编程语言里也是count,更统一。有C/Java背景的人会觉得sizeof更亲切,看个人喜好。

  2. 循环里不要反复调用count()

    // 不推荐:每次循环都执行一次count()
    for($i = 0; $i < count($arr); $i++) { ... }
    
    // 推荐:提前存起来
    $len = count($arr);
    for($i = 0; $i < $len; $i++) { ... }

    数组很大时,每轮都调用count()会有性能损耗。

  3. 检查数组是否为空
    两种写法效果一样:

    if(count($arr) > 0) { ... }
    if(!empty($arr)) { ... }

    我个人倾向用empty(),语义更清晰。但如果要同时拿到元素个数,就用count()。

  4. 字符串会返回什么?

    count("hello");  // PHP 7.2之前返回1,之后返回1但会发警告

    从PHP 7.2开始,对非数组非对象的参数用count()会发出警告。所以用之前确保变量是数组或Countable对象。

示例5:代码号学习编程场景

<?php
// 统计每个学生有几门课程的成绩
$students_scores = [
    "代码号001" => ["语文" => 85, "数学" => 92, "英语" => 78],
    "代码号002" => ["语文" => 91, "数学" => 88],
    "代码号003" => ["语文" => 76, "数学" => 85, "英语" => 90, "物理" => 82]
];

foreach($students_scores as $student_id => $scores) {
    $course_count = count($scores);
    $total_score = array_sum($scores);
    echo "{$student_id} 选了 {$course_count} 门课,总分 {$total_score}\n";
}
?>

示例6:检查传入参数类型

<?php
function processData($data) {
    // 安全检查
    if (!is_array($data) && !is_object($data)) {
        return 0;
    }
    
    $cnt = count($data);
    echo "收到 " . $cnt . " 条数据\n";
    return $cnt;
}

processData([1,2,3]);      // 3
processData("hello");      // 0(不会报错)
?>

本节课程知识要点

  • count()返回数组元素个数或对象public属性个数

  • 第二个参数用COUNT_RECURSIVE可以递归统计多维数组所有层级

  • sizeof()是count()的别名,用法一样

  • 空数组返回0,不会报错

  • 传入非数组、非对象的参数从PHP 7.2开始会产生警告

  • 循环中先把count()结果存到变量里,避免重复调用

← PHP中的compact():把变量打包成数组 PHP中的array_count_values():统计数组元素出现的频率 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号