在PHP项目中,变量来源五花八门:数据库查询结果、JSON接口返回值、用户提交的表单、缓存读取的内容等等。这些数据有时是数组,有时可能是null、字符串甚至对象。如果不对类型做判断就直接遍历或取下标,轻则抛出警告,重则直接 Fatal Error 导致请求中断。本文系统梳理PHP中判断数组类型的常用手段,并结合类型约束与输入校验,给出一套可落地的安全实践方案。

一、is_array:最基础的数组类型判断
is_array是PHP内置的类型检测函数,接受任意变量作为参数,返回布尔值。它的开销极小,且不会对变量本身做任何修改,是最推荐的判断方式。典型用法如下:
$data = json_decode($raw, true);
if (is_array($data)) {
foreach ($data as $item) {
echo $item['name'] . PHP_EOL;
}
} else {
echo '数据不是合法的数组结构';
}
需要注意一个常见误区:json_decode在解析失败时返回null,在解析出的顶层是对象或标量时也不会返回数组。因此判断解析结果时,不能只判断是否为null,而应该用is_array直接确认结构。另一个易错点是empty的滥用——empty($arr)为true时,可能是空数组,也可能是false、0、null等值,它无法区分类型。正确的空数组判断应该先is_array再count,或者直接与[]做全等比较。
// 不推荐:无法区分类型
if (!empty($list)) { ... }
// 推荐:类型与内容分别判断
if (is_array($list) && count($list) > 0) {
foreach ($list as $v) { ... }
}
二、更细粒度的数组形态判断
仅仅知道变量是数组还不够,实际业务中经常要区分索引数组、关联数组和列表。PHP 8.1新增了array_is_list函数,用于判断数组是否是从0开始连续索引的列表,这在处理批量接口数据时非常有用。
$a = [10, 20, 30]; $b = ['name' => 'Tom', 'age' => 18]; $c = [1 => 'a', 2 => 'b']; var_dump(array_is_list($a)); // true var_dump(array_is_list($b)); // false,关联数组 var_dump(array_is_list($c)); // false,索引不是从0开始
对于PHP 8.1以下的版本,可以自己实现同样的逻辑:取出全部键名,检查每个键是否等于其位置下标。此外,判断关联数组可以用array_is_assoc的思路:只要存在一个字符串键或非连续整数键,就视为关联数组。在做数据导入导出、CSV映射等场景时,先区分形态再处理,能避免大量隐蔽的逻辑错误。
另一个技巧是利用array_keys与array_filter组合做结构断言。例如批量入库前,先过滤掉不符合结构的元素,保证进入数据库的都是合法记录,这比在遍历中频繁if判断更清晰。
三、类型声明:让PHP引擎替你把关
从PHP 7开始,函数参数支持数组类型声明,PHP 7.1后可以声明可空类型。配合declare(strict_types=1)严格模式,可以把大部分类型错误拦截在调用阶段,而不是等到运行中突然崩溃。
declare(strict_types=1);
function processItems(array $items): array
{
$result = [];
foreach ($items as $item) {
if (is_array($item) && isset($item['id'])) {
$result[] = (int) $item['id'];
}
}
return $result;
}
// 传入字符串会直接抛出 TypeError
processItems('not an array');
类型声明的局限在于它只能保证“是数组”,不能保证数组内部元素的结构。对于来自外部的数据(比如$_POST、第三方API响应),仍然需要在入口处做一层结构校验。一个实用的做法是编写统一的校验函数,逐个检查必需键是否存在、值类型是否匹配,通过后才进入业务逻辑。也可以借助filter_var或成熟的验证库,把校验规则集中管理,避免散落在各处的临时判断。
还有一点值得强调:foreach一个不可遍历的变量会抛出Warning甚至Error,所以凡是遍历外部数据,前面加is_array判断是成本最低的防御。与其在出错后排查,不如在入口就统一收口。将类型判断、类型声明和结构校验三者结合使用,可以让PHP代码在面对脏数据时保持稳定,这也是工程质量的重要体现。
PHP数组判断is_arraytype hinting数组安全校验修改时间:2026-09-01 05:16:43