PHP empty 判断数组时的常见误解

2次阅读

PHP empty 判断数组时的常见误解

phpempty() 判断数组时,最常被误解的是:它把空数组 [] 当作“空”(返回 true),但很多人误以为它只判断 NULL 或未定义变量,或混淆了它和 isset()count() 的行为。

empty([]) 为 true 是设计如此,不是 bug

empty() 的语义是“值是否为‘空值’”,而 PHP 明确将空数组列为“空值”之一(和 nullfalse0"0""" 并列)。所以:

  • empty([])true
  • empty(['a' => 'b'])false
  • empty($undefined)true(不报错)

这不是异常,而是语言规范。若你本意是“检查变量是否存在且非 null”,该用 isset();若想确认“数组有没有元素”,应直接用 count($arr) === 0!$arr(因数组在布尔上下文中,空为 false)。

别用 empty() 替代 isset() 检查数组键

对数组的某个键做判断时,empty($arr['key']) 可能静默失败:

立即学习PHP免费学习笔记(深入)”;

  • $arr 本身未定义,empty($arr['key']) 不报 Notice(看似安全),但掩盖了变量未初始化的问题
  • $arr 存在但 'key' 不存在,empty($arr['key']) 会触发 Notice: Undefined index(除非错误报告关闭)
  • $arr['key'] 值为 0false""empty() 返回 true,但这未必代表“键不存在”

正确做法是先确保数组存在,再检查键:isset($arr['key'])array_key_exists('key', $arr)

空数组 vs “假值数组”容易混淆

以下情况都让 empty($arr) 返回 true,但含义不同:

  • $arr = []; —— 真正的空数组
  • $arr = null; —— 变量为 null
  • $arr = false; —— 变量是布尔值 false
  • $arr = 0; —— 变量是整数 0

如果你只关心“是不是空数组”,就不要依赖 empty(),而应组合类型与值判断:is_array($arr) && count($arr) === 0,或更高效地写成 is_array($arr) && !$arr(利用数组的布尔转换规则)。

替代方案推荐:按场景选函数

根据实际意图选择更明确的判断方式:

  • 检查变量是否已定义且不为 nullisset($arr)
  • 检查数组是否为空(有无元素)→ count($arr) === 0!$arr(仅限已知是数组时)
  • 检查数组是否为 null 或非数组 → !is_array($arr)
  • 检查数组是否有某个键(不管值是什么)→ array_key_exists('key', $arr)

empty() 前,先问自己:我到底想排除哪些情况?它的宽松性常带来隐含逻辑,反而增加维护成本。

text=ZqhQzanResources