应使用 count() 获取数组长度,它是官方唯一推荐方式;strlen() 不适用,因只处理字符串;需防御性检查变量类型与空值,避免循环中重复调用。

直接用 count(),别犹豫,也别绕路。 它是 PHP 唯一被官方文档明确认可、语义清晰、性能稳定、全版本兼容的数组长度获取方式。其他写法要么是别名(sizeof()),要么是自找麻烦(手动遍历),要么会出错(对非数组调用 strlen())。
为什么不能用 strlen() 判断数组长度
strlen() 只接受字符串,传入数组会直接报 Warning:Warning: strlen() expects parameter 1 to be string, array given。即使数组里全是字符串,你也得先遍历再逐个算——那已经不是“判断数组长度”,而是“算所有元素字符串长度之和”了。
- 数组本身没有“字节长度”概念,
strlen()和数组长度完全不相干 - 有人误用
strlen(serialize($arr))估算大小,但序列化结果受键名、编码、PHP 版本影响,不可靠 - 若真要测内存占用,该用
memory_get_usage()配合克隆,而不是偷换“长度”定义
count() 的参数陷阱:COUNT_RECURSIVE 不等于“总数据量”
对二维或嵌套数组,count($arr, COUNT_RECURSIVE) 返回的是“所有层级元素个数 + 所有子数组自身个数”。它把每个子数组也当做一个独立元素计了一次。
- 比如
$arr = [['a'], ['b', 'c']],count($arr)是 2(行数),count($arr, COUNT_RECURSIVE)是 5(2 个子数组 + 3 个字符串) - 若你真正想要的是“所有叶子值数量”,得用
array_walk_recursive()或显式遍历 +is_scalar()过滤 - 不要在条件判断里无脑加
COUNT_RECURSIVE,除非你明确需要这个混合计数逻辑
空数组和非数组变量的防御性写法
count() 对非数组变量(如 null、string、int)会静默返回 1 —— 这不是 bug,是 PHP 的历史行为。所以不能只靠 count($x) === 0 断定是空数组。
立即学习“PHP免费学习笔记(深入)”;
- 安全判断空数组:先用
is_array($x) && empty($x),或者is_array($x) && count($x) === 0 - 想快速区分空/非空场景,
empty($x)更轻量,但它对0、"0"、false也返回 true,慎用于数值上下文 - 如果变量可能为
null或未定义,务必先做isset($x)或!is_null($x)检查,再进count()
最常被忽略的一点:count() 在循环中反复调用是典型性能坑。比如 for ($i = 0; $i ,每次迭代都重新计算长度。应该提前存成变量:<code>$len = count($arr); for ($i = 0; $i 。这点在大数组或高频循环里,差异立现。



















