用 count($arr) === 0 判断数组是否为空最精确,因它只看元素数量;empty($arr) 适合快速过滤无效输入如 null 或空数组,但对含 falsy 值的非空数组会误判。

empty() 和 count() 判断空数组哪个更安全
直接用 empty() 判断数组是否为空,是最常用也最稳妥的方式。它对空数组、null、false、0、"" 都返回 true,但注意:如果数组里有值为 0、false 或空字符串的元素,empty($arr) 仍会返回 false(因为数组本身非空)。而 count($arr) === 0 更精确——它只看元素数量,不关心内容,不会误判含“falsy 值”的非空数组。
实际建议:
- 想确认“数组有没有元素”,用
count($arr) === 0 - 想快速过滤掉无效输入(比如表单未提交导致的
null或空数组),用empty($arr)更省事 - 不要用
!$arr,它在 PHP 8+ 中对非空数组(含0)也可能意外为true,语义模糊且易出错
array_filter() 对空数组的默认行为
array_filter() 在输入是空数组时,会原样返回空数组,不会报错,也不触发回调函数。这点很关键——你不需要提前判断是否为空再决定是否调用它。
但要注意副作用:
立即学习“PHP免费学习笔记(深入)”;
- 如果传了回调函数,且该函数内部有副作用(比如写日志、查数据库),那空数组下它根本不会执行,逻辑可能被跳过
- 如果不传回调,默认会剔除所有 falsy 值;此时对
[0, false, ""]这种“非空但全 falsy”的数组,结果是空数组,容易误以为原数组就是空的 - PHP 7.4+ 支持
ARRAY_FILTER_USE_BOTH,但空数组下照样不进回调,别指望靠它做兜底处理
foreach 遍历空数组会不会报错
完全不会。foreach 天然兼容空数组:语法合法、不警告、不中断流程,循环体一次都不执行。这是 PHP 的设计保障,不用加 if (!empty($arr)) 再套一层。
不过得留心这些场景:
- 循环体内有依赖数组长度的逻辑(比如计数器初始化、首次赋值标记),空数组会导致变量未定义或初始状态没被覆盖
- 用了
foreach ($arr as $key => &$value)引用遍历,空数组下$value不会被声明,后续直接读取会触发Notice: Undefined variable - 某些 IDE 或静态分析工具(如 PHPStan)可能误报“可能未定义变量”,其实是过度检查
json_encode() 输出空数组的字符串形式
json_encode([]) 固定输出 [],不是 null 或 false。这个行为稳定,但前端解析时容易忽略它和 null 的语义区别。
常见坑点:
- JavaScript 里
[] == false是true,但[] === false是false,用松散比较可能引发逻辑错误 - 如果后端返回
{"data":[]},前端用data?.length安全,但写成data && data.length在data为null时会报错,和空数组无关,却常被混为一谈 - PHP 中开启
JSON_THROW_ON_ERROR选项不影响空数组编码,它只对非法值(如资源类型)抛异常
[] 当 null 处理,或后端在 array_reduce() 里漏设初始值导致空数组返回 null 而不是默认值。



















