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版本实现。建议不要过度依赖递归统计的精确数值,容易踩坑。
个人经验分享
-
sizeof()是个别名
sizeof()和count()一样,只是名字不同。个人习惯用count(),因为其他编程语言里也是count,更统一。有C/Java背景的人会觉得sizeof更亲切,看个人喜好。 -
循环里不要反复调用count()
// 不推荐:每次循环都执行一次count() for($i = 0; $i < count($arr); $i++) { ... } // 推荐:提前存起来 $len = count($arr); for($i = 0; $i < $len; $i++) { ... }数组很大时,每轮都调用count()会有性能损耗。
-
检查数组是否为空
两种写法效果一样:if(count($arr) > 0) { ... } if(!empty($arr)) { ... }我个人倾向用
empty(),语义更清晰。但如果要同时拿到元素个数,就用count()。 -
字符串会返回什么?
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()结果存到变量里,避免重复调用