← PHP shuffle()函数教程:数组随机打乱、键名重建与业务场景实战 PHP sort()函数教程:数组升序排列、排序标志位与关联数组键名丢失实战 →

PHP sizeof()函数教程:数组元素计数、count()别名关系与递归统计实战

著
原创 2026-10-09 PHP 已有人查阅

一、函数定位与别名关系

sizeof()是PHP内置的数组统计函数,作用是返回数组中元素的个数。这个函数从PHP4.0开始提供,它实际上是count()函数的别名。两者在功能、参数、返回值上一致,区别只在于函数名。

函数原型如下:

int sizeof ( array $array [, int $mode = COUNT_NORMAL ] );

参数说明:

参数 说明 是否必需
array 指定要统计的数组 必需
mode 统计模式,可选值0或1 可选

mode参数的取值含义:

  • 0或COUNT_NORMAL:默认模式,只统计当前维度的元素个数,不递归统计多维数组的内部元素。

  • 1或COUNT_RECURSIVE:递归模式,统计多维数组中所有层级的元素总数。

返回值方面,sizeof()返回数组中元素的个数,类型为整数。

关于别名关系,这里有一个容易被忽略的点。虽然sizeof()和count()功能相同,但在PHP官方文档和社区惯例中,count()是推荐使用的名称,sizeof()更多是历史遗留。PHP手册明确把sizeof()标注为count()的别名。在项目中,使用count()可读性更好,也更容易被其他开发者理解。

个人建议:新项目中统一使用count(),sizeof()了解即可。如果接手的老项目里大量使用sizeof(),不需要刻意替换,保持一致性比统一函数名更重要。

二、基础用法与代码号学习编程示例

先看一个一维数组的统计例子。代码号学习编程时,常用数字序列来演示元素计数:

<?php
$number = array(1, 2, 3, 4, 5, 6, 7, 8);
$result = sizeof($number);
print($result);
?>

输出结果为:

8

数组中有8个元素,sizeof()返回8。

再看一个字符串数组:

<?php
$sports = array('cricket', 'hockey', 'football', 'basketball');
$result = sizeof($sports);
print($result);
?>

输出结果为:

4

sizeof()返回数组中的元素个数4。这个过程不关心元素的值是什么,只统计元素的个数。

再看一个课程名称数组:

<?php
$subject = array('os', 'dbms', 'java', 'compiler', 'networking');
$result = sizeof($subject);
print($result);
?>

输出结果为:

5

这三个例子说明,sizeof()对一维数组的统计逻辑是直接的:数元素个数,返回整数。

三、sizeof()与count()的等价验证

第四个例子展示了sizeof()和count()的输出一致性:

<?php
$river = array("ganga", "yamuna", "kaveri", "narmada", "godavari");
echo count($river) . "\n";
echo sizeof($river);
?>

输出结果为:

5
5

两个函数对同一个数组返回相同的结果。这是因为sizeof()在底层就是count()的别名,PHP引擎处理这两个函数名时走的是同一套逻辑。

这里有一个项目实战中的观察。曾经在代码审查时发现,同一个文件里既有count()又有sizeof(),新加入的开发者看到两种写法后产生了疑惑,不确定两者是否有区别,花了时间去查文档。这种不必要的认知成本,通过统一函数名就可以避免。

个人见解:别名函数的存在有其历史原因,但在团队协作中,统一使用count()可以减少沟通成本。sizeof()更适合在阅读老代码时理解其含义,而不是在新代码中主动使用。

四、递归模式与多维数组统计

mode参数是sizeof()需要重点理解的地方。默认模式下,多维数组只统计第一维的元素个数。开启递归模式后,会统计所有层级的元素总数。

先看默认模式:

<?php
$class = array(
    "一班" => array("张三", "李四", "王五"),
    "二班" => array("赵六", "钱七")
);
echo sizeof($class);
?>

输出结果为:

2

默认模式下,sizeof()只统计了第一维的两个键(一班、二班),内部的学生名字没有被计入。

再看递归模式:

<?php
$class = array(
    "一班" => array("张三", "李四", "王五"),
    "二班" => array("赵六", "钱七")
);
echo sizeof($class, 1);
?>

输出结果为:

7

递归模式下,统计结果是2个班级键加5个学生名字,共7个元素。

这里有一个踩坑经历。曾经在做菜单树统计时,需要计算所有菜单项的总数。菜单数据是嵌套数组,最初用sizeof(menu)得到的是顶层菜单数量,和预期的总数不符。后来改用sizeof(menu)得到的是顶层菜单数量,和预期的总数不符。后来改用sizeof(menu,COUNT_RECURSIVE)才得到正确结果。但递归模式也有一个:它会把中间层级的数组本身也计入。如果数组嵌套层次较深,统计结果可能比实际业务需要的数量多。

项目实战反思:递归模式适合统计“所有节点总数”这类需求。如果只需要统计叶子节点数量,递归模式的结果会偏大,需要自己遍历统计。使用前要明确业务需要的是哪种计数口径。

COUNT_RECURSIVE常量比直接写1可读性更好。PHP提供了COUNT_NORMAL和COUNT_RECURSIVE两个常量,分别对应0和1。在代码中使用常量名,意图更清晰。

五、count()家族与相关函数对比

sizeof()和count()之外,PHP还有几个和数组统计相关的函数,需要分清场景。

sizeof()与count():等价,sizeof()是count()的别名。推荐使用count()。

sizeof()与array_count_values():sizeof()统计元素个数,array_count_values()统计数组中每个值出现的次数。前者返回整数,后者返回一个关联数组。需要知道“有多少个元素”用sizeof(),需要知道“每个值出现了几次”用array_count_values()。

sizeof()与strlen():sizeof()用于数组,strlen()用于字符串。strlen()返回字符串的字节长度。两者操作对象不同,不要混用。如果需要统计字符串中的字符个数(多字节场景),应该用mb_strlen()。

sizeof()与iterator_count():sizeof()用于数组,iterator_count()用于可遍历对象。如果数据是Iterator或Generator,不能用sizeof(),需要用iterator_count()或者先转换为数组。

个人建议:在处理不确定是数组还是可遍历对象的数据时,先用is_array()判断,再决定用sizeof()还是iterator_count()。直接对非数组使用sizeof()在PHP8中会抛出TypeError,不会像旧版本那样返回1并产生警告。

六、空数组与边界处理

sizeof()对空数组返回0。这个行为在条件判断中需要注意。

<?php
$emptyArray = array();
echo sizeof($emptyArray);
?>

输出结果为:

0

在判断数组是否为空时,有人习惯用if(sizeof($array)),利用0在布尔上下文中为假值的特性。这种写法可行,但可读性不如if(empty($array))或if(count($array)>0)。明确写出比较条件,意图更清楚。

另一个边界是sizeof()对非数组值的处理。在PHP7.2之前,对null、整数、字符串等非数组值调用sizeof()会返回1,并可能产生警告。PHP7.2开始,对非可计数类型调用sizeof()会产生E_WARNING。PHP8.0开始,直接抛出TypeError。

项目实战反思:如果代码需要兼容较老的PHP版本,并且传入的数据类型不确定,应该在调用sizeof()前用is_array()或is_countable()做判断。is_countable()从PHP7.3开始提供,专门用于判断一个值是否可以被count()或sizeof()统计。

<?php
$data = getDataFromSomewhere();
if (is_countable($data)) {
    echo sizeof($data);
} else {
    echo "数据不可计数";
}
?>

这种防御性写法在数据来源不可控的场景中比较实用,比如处理API返回结果、配置文件解析结果等。

七、本节课程知识要点

  • sizeof()是count()的别名,两者功能、参数、返回值一致。

  • sizeof()返回数组中元素的个数,类型为整数。

  • 默认模式下只统计第一维元素个数,不递归统计多维数组内部元素。

  • mode参数设为1或COUNT_RECURSIVE时,递归统计所有层级的元素总数。

  • 递归模式会把中间层级的数组本身也计入,统计口径需要按业务确认。

  • 新项目推荐统一使用count(),可读性和社区惯例更好。

  • 空数组返回0,条件判断中建议用empty()或明确的比较表达式。

  • 非数组值在PHP8中会抛出TypeError,调用前可用is_countable()判断。

  • 需要统计值出现次数时用array_count_values(),需要统计字符串长度时用strlen()。

sizeof()这个函数本身逻辑简单,核心在于两点:一是理解它是count()的别名,选择使用哪个函数名更多是代码风格问题;二是理解mode参数对多维数组统计结果的影响,递归模式和默认模式的计数口径不同,用错会导致统计结果偏离预期。把这两点弄清楚,数组元素统计就不会出问题。

← PHP shuffle()函数教程:数组随机打乱、键名重建与业务场景实战 PHP sort()函数教程:数组升序排列、排序标志位与关联数组键名丢失实战 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号