PHP如何检测变量是否为数组_PHP检测数组变量方法【检测】

9次阅读

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

PHP 如何检测变量是否为数组_PHP 检测数组变量方法【检测】

is_array() 判断最可靠

PHP 里检测变量是不是数组,is_array() 是唯一推荐的原生方式。它不关心数组内容、键类型或是否为空,只看底层数据结构类型,返回 truefalse

常见错误是用 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() 确认,因为 nullfalse、数字等合法 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() 职责范围内,但容易被当成“检测完就万事大吉”而忽略。

text=ZqhQzanResources