在PHP开发中,统计数组包含值的个数几乎是每天都会用到的操作。无论是分页计算总条数、判断数组是否为空,还是遍历前的长度校验,都离不开数组计数。PHP提供了多种方式来获取数组长度,其中最核心的就是count()函数,另外还有sizeof()这个别名函数,以及一些特殊场景下的处理技巧。本文将从基础用法讲到多维数组、性能优化等进阶内容,帮助大家彻底掌握PHP数组的计数方法。

一、使用count函数统计数组个数
count()是PHP中统计数组长度的标准函数,它返回数组中元素的个数。基本用法非常简单,只需要把数组作为参数传入即可。对于索引数组,返回的就是元素总数;对于关联数组,返回的是键值对的总数,这一点和JavaScript等语言有所不同,PHP的关联数组和索引数组在计数上没有区别。
<?php // 索引数组 $arr1 = ['apple', 'banana', 'orange']; echo count($arr1); // 输出 3 // 关联数组 $arr2 = ['name' => 'Tom', 'age' => 20, 'city' => 'Beijing']; echo count($arr2); // 输出 3 ?>
需要注意的是,如果传入的不是数组而是其他类型的变量,count()在PHP 7.2之前会对null返回0,对标量类型发出警告并返回1。PHP 7.2之后,对无效类型会抛出TypeError或发出警告,因此在使用前最好先确认变量确实是数组,可以用is_array()做判断,避免程序报错。
另外还有一种常见的误用:有人以为count()能统计数组中某个值出现的次数,实际上它只统计元素个数。如果要统计某个特定值出现了多少次,应该用array_count_values()函数,它返回一个新数组,键是原数组的值,值是对应出现的次数。
<?php $list = ['red', 'blue', 'red', 'green', 'red']; $result = array_count_values($list); print_r($result); // 输出: Array ( [red] => 3 [blue] => 1 [green] => 1 ) ?>
二、多维数组的递归统计与sizeof函数
当数组是多维结构时,count()默认只统计第一层的元素个数。比如一个二维数组有三个子数组,默认返回3,而不是所有叶子元素的总数。如果想要统计所有层级的元素总数,需要传入第二个参数COUNT_RECURSIVE(或数字1),启用递归计数模式。
<?php
$multi = [
'fruits' => ['apple', 'banana'],
'colors' => ['red', 'green', 'blue']
];
echo count($multi); // 输出 2(只统计第一层)
echo count($multi, COUNT_RECURSIVE); // 输出 7(包含中间层键)
echo count($multi, 1); // 与上一行等价
?>递归计数的结果包含了中间层的子数组本身。上面的例子中,第一层有2个元素,fruits子数组有2个值,colors子数组有3个值,合计2+2+3=7。理解这一点很重要,否则统计结果会与预期不符。如果只想统计叶子节点的数量,需要自己编写递归函数遍历统计。
至于sizeof(),它是count()的完全别名,功能一模一样,没有性能差别。这个函数存在的原因主要是为了照顾从C语言转过来的开发者的习惯。在团队协作中建议统一使用count(),因为它是PHP官方文档推荐的标准写法,可读性也更好,避免阅读代码的人产生困惑。
三、判断数组是否为空的最佳实践
统计数组个数的一个高频场景是判断数组是否为空。常见的写法有三种:count($arr) == 0、empty($arr)和$arr === []。三者在数组场景下都能工作,但细节上有差异。empty()对null、未定义变量、空字符串、0等都会返回true,如果变量可能不是数组,用它判断会有逻辑漏洞。
<?php
$arr = [];
// 方式一:count计数判断
if (count($arr) === 0) {
echo '数组为空';
}
// 方式二:empty判断(注意null也会进入这里)
if (empty($arr)) {
echo '变量为空';
}
// 方式三:严格比较(PHP 5.4+ 推荐)
if ($arr === []) {
echo '数组确实为空';
}
?>推荐使用$arr === []的严格比较方式,它既保证了变量必须是数组类型,又避免了计数开销,语义也最清晰。而count($arr) === 0的写法在变量未定义或为null时可能触发警告,除非先用isset()确认,例如写成isset($arr) && count($arr) === 0。
四、性能优化:循环中避免重复调用count
一个容易被忽视的性能问题是把count()写在循环条件里。对于普通数组来说影响不大,因为count的时间复杂度是O(1),PHP内部直接读取数组的长度属性。但在遍历迭代器对象或某些动态生成的数据源时,每次调用count都可能重新计算,造成不必要的开销。良好的习惯是在循环前先把长度存到变量中。
<?php
// 不推荐:每次循环都调用count
for ($i = 0; $i < count($bigArray); $i++) {
// 处理逻辑
}
// 推荐:提前缓存长度
$len = count($bigArray);
for ($i = 0; $i < $len; $i++) {
// 处理逻辑
}
?>其实在大多数日常场景下,遍历数组用foreach比for循环更合适,既不需要手动计数,也不用担心索引不连续的问题。PHP的数组底层是哈希表,索引数组删除元素后键可能不连续,此时用for循环配合count取值会出现遗漏,而foreach会遍历所有实际存在的元素,更加安全可靠。
总结一下:PHP统计数组值的个数首选count()函数,多维数组递归统计加上COUNT_RECURSIVE参数,统计特定值出现次数用array_count_values(),判断空数组推荐$arr === []写法。掌握这些细节,数组计数相关的代码就能写得既正确又高效。