empty([]) 返回 true,因 empty() 判定数组仅依据长度是否为 0,不关心元素值是否为空;含 null、"" 或 0 的非空数组均返回 false。

这说法不对——empty() 判断空数组([])时,返回的是 true,不是 false。如果你观察到返回 false,说明该数组**不是空的**,哪怕它只含一个“看起来空”的元素(比如 null、"" 或 0)。
empty() 对数组的判定逻辑
empty($arr) 不是检查“每个元素是否为空”,而是判断整个变量是否属于 PHP 定义的 8 类“falsy 值”之一。对数组来说,唯一让它返回 true 的情况是:数组已定义且长度为 0(即 [])。
它不关心内容语义,只看结构存在性 + 元素数量:
-
empty([])→true(空数组,长度 0) -
empty([null])→false(1 个元素,哪怕值是null) -
empty([''])→false(1 个空字符串元素) -
empty([0])→false(1 个整数 0 元素) -
empty(['0'])→false(1 个字符串'0'元素) -
empty(null)→true(但这是null,不是数组) -
empty($undefined)→true(未定义变量,也不是数组)
为什么有人误以为 empty([]) 返回 false?
常见混淆点来自以下两种情况:
- 把
empty()和isset()搞混:例如$arr = [];时,isset($arr)是true,但empty($arr)是true—— 二者目的完全不同 - 测试了非空数组却误认为“应该算空”:比如
$arr = [null, '', 0];,这个数组有 3 个元素,empty($arr)必然返回false,哪怕所有值都是 falsy
想判断“数组所有值在业务上都为空”怎么办?
这时 empty() 不够用,需配合过滤或遍历:
- 用
array_filter($arr)去掉所有 falsy 值(包括0、false、''等),再看count()是否为 0 - 若要保留
0或'0'等合法值,得写自定义回调:array_filter($arr, fn($v) => !is_string($v) || trim($v) !== '') - 或直接遍历:
foreach ($arr as $v) { if (!empty($v)) return false; },全走完没跳出才算真“全空”
核心记住:empty 判数组,只认长度,不读内容。









