PHP 8.2 判断数组是否为空需分三类:①真正空数组——is_array($arr) && count($arr) === 0;②null或未定义——!isset($arr)或$arr === null;③逻辑全空——count(array_filter($arr)) === 0。

PHP 8.2 中判断数组是否为空,关键不是“怎么写”,而是“你想判什么”——空数组、null、全空值(如 ['', null, 0, false])在语义和逻辑上完全不同,混用会导致 bug。下面按实际开发中最常遇到的三类情况,分清楚、讲明白。
判断是不是「真正空数组」:有且仅有 0 个元素
这是最严格的“空”:变量必须是数组类型,且长度为 0。不接受 null、字符串、对象,也不关心里面有没有 0 或 false ——只要它有元素,就不算空。
✅ 推荐写法:
is_array($arr) && count($arr) === 0
⚠️ 注意:
– empty($arr) 虽然对 [] 返回 true,但对 null、false、0 也返回 true,无法区分类型;
– count($arr) === 0 单独用会把 null、字符串甚至数字都当成“长度 0”(PHP 8.2 仍保持该行为),必须加 is_array() 做前置校验。
判断是不是「null 或未定义」:连数组结构都没有
这不是“空数组”,是“根本没这个数组”。比如函数返回 null 表示失败,或变量压根没声明。此时你不能调用 count() 或遍历,否则触发 Warning。
立即学习“PHP免费学习笔记(深入)”;
✅ 推荐写法:
-
!isset($arr)→ 检查变量是否存在且不为null(最常用) -
is_null($arr)→ 仅当确定变量已存在,只关心它是否为null -
$arr === null→ 类型严格比较,安全可靠
❌ 避免:
– empty($arr):把 null、0、'' 全归为“空”,语义模糊;
– count($arr) === 0:对 null 返回 0,造成误判。
判断是不是「逻辑上全空」:数组存在,但每个值都被视为“空”
比如表单提交了 ['name' => '', 'age' => null, 'tags' => []],业务上认为这等于“没填”。这时你要过滤掉所有 falsy 值再看是否剩东西。
✅ 推荐写法:
-
count(array_filter($arr)) === 0→ 默认规则(移除''、null、0、false、[]等) - 如需保留
'0'或0(例如年龄字段允许填 0),用回调明确规则:count(array_filter($arr, fn($v) => !is_null($v) && $v !== '' && $v !== [])) === 0
⚠️ 注意:
– empty($arr) 不适用:它只看整个数组结构,不管内部值;
– foreach 手动遍历也可行,但 array_filter() 更简洁、函数式、易读。
一句话总结三者区别
空数组 = 是数组,且 count() === 0;
null = 不是数组,甚至不是有效变量,是“无”;
全空值 = 是数组,有键有值,但每个值在业务语义中都算“没内容”。



















