判断空数组应优先用 is_array($arr) && count($arr) === 0,因 empty() 会误判 null、0、"0" 等 falsy 值;array_is_list() 和 array_key_exists() 不适用;json 场景需先校验类型再解析。

用 empty() 判断空数组最常用但有陷阱
empty() 对空数组 [] 返回 true,看起来很直接。但它也会把 null、false、0、"0"、"" 等“falsy”值一并判为“空”,如果字段可能为这些值(比如数据库查出来是 null 或字符串 "0"),就容易误判。
实操建议:
- 仅当确认字段类型一定是数组(或
null)时,才放心用empty($arr) - 如果字段来自用户输入、API 或数据库,优先用更明确的判断方式
用 is_array() + count() 组合最稳妥
先确保是数组,再看长度是否为 0。这样能排除字符串、null、对象等干扰类型,避免把 "0" 或 0 当成空数组。
示例:
if (is_array($field) && count($field) === 0) {
// 是空数组
}
注意:count() 对非数组返回 1(PHP 7.2+),所以必须先 is_array(),否则 count(null) 会返回 0,导致误判。
用 array_is_list() 和 array_key_exists() 不适用
别被名字误导:array_is_list() 判断是否为“列表式数组”(键连续从 0 开始),和“是否为空”无关;array_key_exists() 是查某个键是否存在,不能用于判断整个数组是否为空。
常见错误现象:
- 写
array_is_list([])→ 返回false,但空数组确实是空的,这结果毫无意义 - 写
array_key_exists(0, $arr)→ 只查第一个键,对[1 => 'a']就漏判了
JSON 场景下要注意字符串化后的空数组
从 JSON 解析来的字段,比如 json_decode($json, true) 后得到 [],没问题;但如果原始 JSON 是 "[]"(字符串而非数组),那变量其实是字符串,不是数组。
这时候 empty($field) 会返回 true,但 is_array($field) 是 false —— 容易忽略类型转换失败的情况。
建议加一层类型校验:
if (is_string($field)) {
$decoded = json_decode($field, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded) && count($decoded) === 0) {
// 真正的空数组(来自 JSON 字符串)
}
}
空数组本身不复杂,但实际项目里它常混在类型不确定的变量里,多一层 is_array() 几乎零成本,却能避开大量隐性 bug。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











