is_array 只识别 php 原生数组类型,对 json 字符串、stdclass、arrayobject、laravel collection 等均返回 false;需用 is_iterable 判断可遍历性,或先 json_decode($input, true) 再 is_array。

is_array 用来判断一个变量是否为数组,返回 true 或 false,不是“用法复杂”,而是“容易误判类型边界”——尤其在处理 JSON 解析、API 返回、表单提交数据时。
什么时候 is_array 会返回 false 却你以为它是数组?
常见于以下场景:
- JSON 字符串未
json_decode就直接传入:is_array('{"a":1}')→false(字符串不是数组) -
json_decode($json, false)返回stdClass对象(默认行为),is_array对它返回false - 空值或
null、0、false、字符串"array"都不是数组 - 对象实现了
ArrayAccess接口(如 Laravel 的Collection),但is_array仍返回false
is_array 和 is_iterable 该怎么选?
如果你真正想做的是“能遍历就行”,而不是“必须是原生数组”,is_iterable 更安全:
-
is_array([1,2])→true;is_iterable([1,2])→true -
is_array(new ArrayObject([1,2]))→false;is_iterable(new ArrayObject([1,2]))→true -
is_array($collection)(Laravel Collection)→false;is_iterable($collection)→true
注意:is_iterable 是 PHP 7.1+ 才支持,老项目慎用。
和 gettype / instanceof 混用的典型错误
别用 gettype($var) === 'array' 替代 is_array ——虽然结果一样,但 is_array 是类型检查专用函数,语义清晰且略快;更关键的是,别写这种逻辑:
if (is_array($data) || $data instanceof ArrayObject) { ... }
这暴露了你其实想要“可遍历结构”,那就该统一用 is_iterable,而不是拼凑判断。另外,instanceof 对 ArrayObject 有效,但对普通数组无效(数组不是类实例)。
实际写法建议:加一层防御性解码再判断
尤其对接外部数据时,推荐这样写:
$input = $_POST['data'] ?? null;
$data = is_string($input) ? json_decode($input, true) : $input;
if (is_array($data)) {
// 安全处理
}
关键点:
- 先
json_decode($input, true)强制转为关联数组(避免对象) - 检查
json_last_error() === JSON_ERROR_NONE更严谨,但is_array可作为快速兜底 - 不要依赖
$_POST值的原始类型——浏览器提交的多维数组可能被 PHP 自动转成字符串(如name="items[0][id]")
最常被忽略的是:PHP 的 is_array 不识别 JSON 字符串、不兼容对象式数组、也不管你心里想的是“数组感”。它只认 PHP 内核里 IS_ARRAY 这个类型标记。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











