count函数仅适用于数组和Countable对象,参数为数组和可选的COUNT_RECURSIVE;避免在循环中重复调用,推荐用empty()判空,普通对象不支持除非实现Countable接口。

count 函数的基本写法和参数含义
count 是 PHP 中统计数组元素个数的内置函数,不是万能计数器,只对数组和实现了 Countable 接口的对象有效。传入字符串、整数或 null 会返回 1(PHP 7.2+ 起对非数组/Countable 类型触发 E_WARNING,但依然返回 1)。
基本用法只有两个参数:
-
count($array):默认使用COUNT_NORMAL(即只统计一级元素) -
count($array, COUNT_RECURSIVE):递归统计所有嵌套层级的元素
注意:COUNT_RECURSIVE 遇到循环引用会报 Fatal error: Nesting level too deep,不能自动检测环。
常见错误:count 检查空数组却用了错误条件
很多人写 if (count($arr) > 0) 或 if (count($arr)),逻辑没错,但效率低且语义弱。PHP 官方推荐直接用 empty($arr) 或 !$arr(对索引/关联数组都安全),因为 empty 是语言结构,不调用函数,也不触发任何警告。
立即学习“PHP免费学习笔记(深入)”;
以下写法要避免:
-
if (count($arr) == 0)—— 多一次整数比较,且不如empty()直观 -
if (count($arr))—— 在 $arr 为0、"0"、false等 falsy 值时行为混乱(count会返回1) -
count($obj)对普通对象报Warning: count(): Parameter must be an array or an object that implements Countable
count 与 foreach 性能关系:别在循环里反复调用
如果要在 foreach 中判断是否是最后一个元素,或需要总数做下标运算,不要这样写:
foreach ($items as $i => $item) {
if ($i === count($items) - 1) { /* last */ }
}每次迭代都重新计算长度,O(n²) 时间复杂度。应提前缓存:
-
$total = count($items);放在循环外 - 或者改用
for循环,天然持有长度变量 - 若只是判断末尾,可用
end($items) === $item(但注意指针副作用)或更稳妥的array_key_last($items) === $i(PHP 7.3+)
count 统计对象数量?得看它是否实现 Countable
普通对象不能直接 count($obj),否则报错。只有显式实现 Countable 接口的对象才支持:
class MyCollection implements Countable {
private array $data = [];
public function count(): int { return count($this->data); }
}常见可 count 的对象包括:ArrayObject、SplFixedArray、Laravel 的 Collection(底层调用 count() 方法)。但 stdClass、Eloquent 模型实例、PDOStatement 等都不行——它们的“数量”需通过其他方式获取(如 $model->count() 是查询数据库,不是内存计数)。
容易被忽略的是:count 对对象永远只调用其 count() 方法,不会遍历属性或模拟数组行为。



















