is_array() 是 php 中判断变量是否为数组的唯一可靠方法,它直接检查底层数据结构类型,不依赖内容、键类型或是否为空,且兼容所有 php 版本。

用 is_array() 判断最可靠
PHP 里检测变量是不是数组,is_array() 是唯一推荐的原生方式。它不关心数组内容、键类型或是否为空,只看底层数据结构类型,返回 true 或 false。
常见错误是用 isset($var) && !empty($var) 或 count($var) > 0 来“间接判断”,这会漏掉空数组([]),也误判非数组但可计数的对象(比如实现了 Countable 接口的类)。
-
is_array(null)→false -
is_array([])→true -
is_array(new stdClass())→false -
is_array("abc")→false
别用 gettype() 或 get_class() 替代
gettype() 返回字符串 "array" 看似可行,但它在 PHP 8.0+ 对某些内部结构(如某些扩展返回的 pseudo-array)可能不稳定;get_class() 根本不适用——数组没有类。
更隐蔽的问题是:有人把 is_object($var) || is_array($var) 当成“是否可遍历”的判断,但这会把 Traversable 对象(如 Generator)漏掉,且和“是不是数组”完全不是一回事。
立即学习“PHP免费学习笔记(深入)”;
-
gettype([])是"array",但依赖字符串匹配,多一层脆弱性 -
get_class([])会报Fatal error: Call to a function on a non-object - 用
is_iterable()检查“能否foreach”是另一件事,不能替代is_array()
注意 json_decode() 后的类型陷阱
从 JSON 解析出来的数据,默认是对象(stdClass),不是数组,除非显式传 true 作为第二个参数。
典型翻车场景:API 返回 [{"id":1}],你写 $data = json_decode($json);,然后直接 is_array($data[0]) —— 这里 $data 是对象,$data[0] 会报 Notice: Trying to access array offset on value of type object。
- 要得到数组,必须写
json_decode($json, true) - 解析后仍需用
is_array()确认,因为null、false、数字等合法 JSON 值也会被解出来 -
json_last_error() === JSON_ERROR_NONE要先检查,否则json_decode()失败返回null,再套is_array()就变成判断null了
性能和兼容性没悬念,但别在热路径反复调用
is_array() 是 C 实现的内置函数,开销极小,PHP 5.6 到 8.3 行为完全一致,不用考虑版本适配。
真正要注意的是:如果在循环里对同一个变量反复判断(比如 foreach 前每次都 is_array($items)),属于冗余操作。应该在进入逻辑前一次性校验,或用断言/文档明确约定输入类型。
- 函数入参建议用类型声明:
function process(array $items),PHP 7.0+ 会自动报TypeError - 如果必须兼容弱类型输入,校验一次就够了,别嵌套在循环体里
- 第三方 API 返回不确定结构时,
is_array()是安全底线,但最好配合array_key_exists()或isset()查字段
数组类型判断本身很简单,难的是后续怎么处理——比如空数组要不要跳过、关联数组和索引数组是否走不同分支、嵌套结构是否需要递归校验。这些不在 is_array() 职责范围内,但容易被当成“检测完就万事大吉”而忽略。











