is_array() 是最直接可靠的方式判断变量是否为数组,它仅依据 PHP 内部类型标识返回布尔值,不依赖内容或字符串比较,比 gettype()、count() 或 foreach 更稳定安全。

用 is_array() 是最直接可靠的方式
PHP 里判断一个变量是不是数组,is_array() 就是专干这事的函数,它不看内容、不猜类型,只认 PHP 内部的数组类型标识。返回 true 或 false,没有歧义。
常见错误是拿 gettype($var) === 'array',虽然也能对上,但多了一层字符串比较,且 gettype() 在某些扩展(比如某些序列化场景或自定义对象)里可能被干扰,不如 is_array() 稳定。
-
is_array([])→true -
is_array(null)→false -
is_array('abc')→false -
is_array(new stdClass())→false
别用 count() 或 foreach 来“间接判断”
有人会写 if (count($var) > 0) 或尝试 foreach ($var as $v) 然后加 catch,这不仅逻辑错位,还埋了坑:
-
count(null)或count(42)会触发E_WARNING(PHP 8+ 默认报TypeError),不是静默失败 -
foreach遇到非数组、非可遍历对象(如int、string)直接 fatal error,没法兜底 - 空数组
[]的count()是 0,但你无法区分它是空数组还是null或false
这些写法本质是在“试运行”,不是“判断类型”。该用类型检查就用类型检查。
立即学习“PHP免费学习笔记(深入)”;
注意 is_array() 对 JSON 解码结果的影响
从 json_decode() 得来的数据,是否是数组取决于第二个参数:
-
json_decode('{"a":1}')→ 返回stdClass对象,is_array()为false -
json_decode('{"a":1}', true)→ 返回关联数组,is_array()为true
如果你不确定上游数据结构,又想统一按数组处理,别跳过这个参数。硬转 (array) 也不行:对象转成数组后键名会保留,但嵌套对象不会递归转,行为不可靠。
PHP 8+ 可以用联合类型 + 属性声明替代运行时判断
如果变量来自方法参数或属性,更早的约束比运行时 is_array() 更安全:
function processItems(array $items): void {
// 这里 $items 必定是数组,无需再 is_array()
}
或者在类属性中声明:
class Config {
public array $features = [];
}
这样 PHP 引擎会在赋值时自动校验,而不是等你写一堆 if (!is_array($x)) { ... }。不过要注意:这种类型声明只对显式赋值和参数传入生效,对动态获取的值(如 $_POST、json_decode 结果)仍需手动判断。
真正容易被忽略的是:is_array() 不区分索引数组和关联数组,也不管是否为空——它只回答“是不是数组”这一个问题。别的需求,得另外处理。



















