count() 仅返回数组或countable对象的元素个数,不遍历筛选;默认只计第一层,多维数组需用count_recursive;对非数组类型静默处理,返回值恒为int但容错性高易致逻辑错误。

count() 不是用来“遍历”或“筛选”的,它只干一件事:返回数组或可数对象的元素个数。传进去什么,它就按规则数什么——不是你想让它怎么数,它就怎么数。
count() 默认只数第一层,多维数组容易误判
给一个二维数组 $arr = [[1, 2], [3, 4, 5]],count($arr) 返回的是 2,不是 5。它只看最外层数组有多少个“项”,每个子数组算作一个项。
- 这是默认行为,
mode参数不传或设为COUNT_NORMAL(即0)时都一样 - 如果你真要总数,必须显式加第二个参数:
count($arr, COUNT_RECURSIVE) - 但注意:
COUNT_RECURSIVE会把所有嵌套数组本身也当“元素”计一次,比如[[1, 2], [3, [4]]]会返回6(1,2,3,[4],[1,2],[3,[4]]),不是纯叶子节点数
传错类型不会报错,但结果可能出人意料
count() 对非数组、非 Countable 对象的处理是“静默兜底”:
- 传字符串:
count("abc")→ 返回1(不是3!想数字符请用strlen()) - 传整数、
null、未定义变量:count(123)、count($undefined)→ 都返回0或1,且可能触发E_WARNING - 传普通对象(没实现
Countable):count(new stdClass())→ 返回1,不是属性个数 - 想数对象属性?得先转成数组:
count((array)$obj),但要注意私有/受保护属性的键名变化
性能看似 O(1),但递归模式会明显变慢
单层数组的 count() 确实快,因为 PHP 数组内部存了长度,直接读;但一旦开启 COUNT_RECURSIVE,就得真正遍历整个结构。
- 对深度大、分支多的嵌套数组,
count($bigArr, 1)可能比循环还慢,且消耗更多内存 - 如果只是判断“是否为空”,用
empty($arr)比count($arr) === 0更轻量、语义更准 - 频繁调用?别在循环里反复
count()同一个数组,缓存结果更稳妥
sizeof() 和 count() 完全等价,别被名字误导
sizeof() 就是 count() 的同义函数,连源码都是同一个实现。它们参数、行为、返回值一模一样。
- 选哪个纯看团队习惯,没必要为了“看起来不同”而混用
- 某些 IDE 或静态分析工具可能只识别
count(),sizeof()有时会被标为“未定义函数”(其实是误报) - PHP 官方文档里只列
count(),sizeof()属于历史兼容别名
最常被忽略的一点:count() 的返回值类型始终是 int,但它对非法输入的容忍度太高——既不严格报错,也不强制类型约束。这意味着,你传了个意外的类型,它可能默默返回 0 或 1,而你的逻辑已经悄悄跑偏了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











