接口返回数据是否为数组必须用is_array()校验,先json_decode转义再判断,警惕null/字符串伪装及空数组误判,结构上需验证键存在性和子项类型。

接口返回的数据是否为数组,不能只靠肉眼或经验判断,必须用代码做明确、安全的类型校验。PHP 中最可靠的方式是 组合 is_array() + 类型兜底 + 结构验证,避免因空值、JSON 解析失败、字符串伪装等导致误判。
必须用 is_array() 做第一道关卡
这是 PHP 官方推荐且最直接的判断方式,专用于识别数组类型,不依赖值内容,也不受类型隐式转换干扰:
- 它返回布尔值,true 表示确实是数组(包括空数组),false 则一定不是
- 即使接口返回的是
"[]"字符串,is_array("[]")也稳稳返回false,不会误判 - 不要用
gettype() === "array"替代——虽然结果一致,但多一次函数调用,且语义不如is_array()清晰
先 json_decode 再判断,别跳过这步
绝大多数 PHP 接口返回的是 JSON 字符串,比如 {"data":[1,2,3],"success":true}。如果直接对原始响应体调用 is_array(),结果一定是 false(因为它是字符串):
- 务必先用
json_decode($response, true)转成 PHP 变量 - 解码后检查是否为
null:若 JSON 格式错误或为空字符串,json_decode会返回null,此时再调is_array()没意义 - 建议写成:
$data = json_decode($response, true); if (is_array($data) && isset($data['data'])) { ... }
警惕“伪数组”:空值、false、0 都不是数组
有些接口在异常时返回 false、0、null 或空字符串,前端或中间层可能未处理就直接传给你的判断逻辑:
立即学习“PHP免费学习笔记(深入)”;
-
is_array(null)→false,安全 -
is_array(0)→false,安全 - 但如果你写了
if (!$data || !is_array($data)),要注意![]是true(空数组被当作 falsy),会误拦截合法空数组 - 正确写法是显式判断:
if (!is_array($data)) { throw new InvalidArgumentException('接口未返回数组'); }
关联数组 or 索引数组?按需加结构校验
确认是数组后,还要看它是否符合你预期的结构。例如你期望 $data['list'] 是个索引数组,但实际可能是关联数组或单个对象:
- 检查键是否存在:
array_key_exists('list', $data)比isset($data['list'])更稳妥(能捕获null值) - 确认子项是数组:
is_array($data['list']),而不是直接foreach($data['list'] as ...) - 必要时用
array_is_list($data['list'])(PHP 8.1+)判断是否为纯数字索引数组



















