最稳妥的方式是用 count($arr) === 0;empty() 会误判含 0、"0"、false 的数组,isset($arr[0]) 不适用于关联或稀疏数组,非数组变量需先 is_array() 防警告。

用 empty() 最简单,但要注意它会把 0、"0"、false 也当空
empty() 是最常用的写法,写起来快,语义也清楚:
if (empty($arr)) {
echo "数组为空";
}
但它不是专为“数组是否为空”设计的——它检测的是“值是否为 falsy”。所以这些都会被误判为空:
-
empty([0])→true(实际有 1 个元素) -
empty(["0"])→true(字符串"0"被当成 falsy) -
empty([false])→true
如果你的数组只存字符串或数字且不含这些“假值”,empty() 没问题;否则得换更精确的方式。
用 count() 判断长度,最稳妥
判断数组是否为空,本质是看元素个数是不是 0。所以直接比长度最可靠:
if (count($arr) === 0) {
echo "数组为空";
}
注意三点:
- 必须用
=== 0,避免类型转换干扰(比如count(null)返回0,但你可能想先检查变量是否为数组) -
count()对非数组返回1(PHP 7.2+),所以如果$arr可能不是数组,要先加is_array() - 对超大嵌套数组,
count($arr, COUNT_RECURSIVE)会慢,但普通一维/二维不用管
用 is_array() + !count() 防止警告
如果 $arr 可能是 null、string 或未定义变量,直接 count($arr) 会触发 warning(PHP 8.0+ 是 TypeError):
if (!is_array($arr) || count($arr) === 0) {
echo "不是数组,或数组为空";
}
这个组合既安全又明确:
-
is_array()先兜底,排除非法类型 -
count() === 0精确判断空数组 - 不依赖
empty()的隐式类型转换逻辑
别用 isset($arr[0]) 判断数组是否为空
有人会想:“只要第一个键不存在,那数组就空了”,于是写:
if (!isset($arr[0])) { ... }
这在多数情况下看似有效,但容易翻车:
- 关联数组(如
["name" => "Alice"])没有键0,但显然不为空 - 数组键被显式 unset 过(如
unset($arr[0])),即使还有其他元素也会被误判 - 稀疏数组(如
[1 => 'a', 5 => 'b'])同样不适用
这种写法混淆了“是否存在索引 0”和“数组是否为空”,逻辑上就不成立。
真正要判断“数组是否为空”,核心就一条:看 count() 是否为 0;其余所有捷径,要么有陷阱,要么靠运气。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











