empty() 是判断数组是否为空的安全推荐方式,直接检查哈希表长度,常数时间完成,且对含 0/''/null 的数组仍准确;但需确保变量确为数组,避免用于对象或迭代器。

PHP empty() 判断数组是否为空,直接用就行
empty() 对数组是安全且推荐的判断方式——它会把空数组 [] 当作 true(即“为空”),返回 true;非空数组返回 false。不需要额外转换或包装。
常见误判场景:有人用 if ($arr == []) 或 if (count($arr) === 0),前者在 PHP 中可能触发类型松散比较陷阱,后者多一次函数调用、且对大数组有轻微性能开销。
-
empty([])→true -
empty(['a' => 1])→false -
empty(['' => ''])→false(键为字符串''也算元素) -
empty([null])→false(含一个null值仍是非空数组)
为什么 empty() 比 count() 更适合日常判断
count() 要遍历数组结构计数,而 empty() 是语言结构(不是函数),底层直接检查数组的 ht(hash table)长度字段,常数时间完成,无额外开销。
尤其在循环内、高频判断或处理大数组时,差异可测。不过注意:empty() 对未定义变量也静默返回 true,这点和 isset() 不同。
- ✅ 推荐:
if (empty($data)) { /* 处理空数组 */ } - ⚠️ 小心:
if (empty($undefined))不报错也不警告,但你可能其实想先确认变量是否存在 - ❌ 不必要:
if (count($data) === 0)—— 多此一举,除非你明确需要知道具体元素个数
遇到关联数组或含 0/''/null 的数组,empty() 还准不准
准。只要数组里至少有一个有效键值对(哪怕值是 0、false、''、null),empty() 都返回 false。它只关心“有没有元素”,不关心“元素的值是否为 falsy”。
这是它和 !$arr 的关键区别:![] 是 true,但 ![0] 也是 true(因为 [0] 转布尔为 true,取反后为 false?不对——等等,实际是:if ([0]) 为真,所以 ![0] 是 false;但重点在于,! 是对整个数组表达式做布尔转换,而 PHP 数组转布尔永远为 true,无论内容。所以 ![0]、![] 全是 false —— 这就是为什么绝不能用 !$arr 判断空数组。
-
empty([0])→false(有元素) -
empty(['key' => null])→false(有键值对) -
empty([0 => ''])→false -
![]→false(错误写法,永远不成立)
真正要小心的是“假空数组”:对象、Traversable、JSON 解码失败
empty() 只对数组、字符串、数字、null 等基础类型行为明确。如果变量其实是 ArrayObject、stdClass 或 Iterator 实例,empty() 可能返回意外结果(比如 ArrayObject 默认被当作非空对象,empty() 返回 false 即使它内部没元素)。
还有更隐蔽的坑:从 JSON 接口拿到数据后直接 json_decode($json),默认返回对象;若没加 true 参数,empty() 对该对象的行为就不是“判断数组空”,而是判断对象是否为“空对象”,这在 PHP 7.4+ 中返回 false(对象非空),完全偏离预期。
- ✅ 安全做法:
$arr = json_decode($json, true); if (is_array($arr) && empty($arr)) { ... } - ⚠️ 易错点:
$obj = json_decode($json); empty($obj)—— 这不是在查数组 - ⚠️ 易错点:
empty($collection),其中$collection是 Laravel 的Collection实例 —— 它重写了__isset(),但empty()不走这个逻辑,得用$collection->isEmpty()
实际写的时候,别想太多“是不是最优雅”,先盯住三点:变量确定是数组、没被意外转成对象、没混进 Iterator 类型。其他都是次要的。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











