最安全判断变量是否为数组用 is_array();判空优先 empty(),但需先确保变量存在且为数组;区分索引/关联数组可用 array_values($arr) === $arr;foreach 前必须 is_array() 防警告。

PHP里怎么判断一个变量是不是数组
直接用 is_array() ——这是最安全、最推荐的方式。其他方法(比如检查 count() 或 isset())容易误判,尤其遇到 null、false、字符串或对象时。
-
is_array($var)返回true仅当$var是真正的数组类型,包括空数组[] - 不要用
gettype($var) === 'array':虽然结果一致,但多一次字符串比较,且gettype()本身开销略大 - 避免用
!empty($var) && is_iterable($var):可迭代不等于数组(Generator、Traversable 对象也会通过)
判断数组是否为空用 empty() 还是 count() === 0
优先用 empty()。它对 []、null、false、0、'' 都返回 true,但要注意:如果变量未定义,empty($undefined) 不报错,而 count($undefined) 会触发 Notice: Undefined variable。
- 确认变量已存在且确定是数组?用
count($arr) === 0更明确,性能也略好(尤其大数组,empty()内部仍需检查结构) - 不确定变量是否存在或类型?先
isset($arr) && is_array($arr) && empty($arr) -
array_key_exists(0, $arr)不适合判断“是否为空”,它只查键存在性,和数组长度无关
判断关联数组还是索引数组
PHP 没有原生函数直接区分,得靠逻辑判断。关键看键名是否为连续数字且从 0 开始。
- 用
array_keys($arr)获取所有键,再对比range(0, count($arr) - 1)是否相等(注意:===比较值和类型) - 更轻量的写法:
array_values($arr) === $arr—— 如果重排键后和原数组完全一致,说明原数组是「纯索引」(但不保证从 0 开始;若要求严格从 0 开始,还需额外检查key($arr) === 0) - 别用
json_encode()后看是否以[开头:不可靠,比如['0' => 'a', '1' => 'b']是关联数组但 JSON 是{"0":"a","1":"b"}
在 foreach 前要不要先判断是不是数组
要。直接 foreach($var as $k => $v) 遇到非数组(如 string、int)会报 Warning: Invalid argument supplied for foreach(),而且无法被 try/catch 捕获(这是 E_WARNING,不是异常)。
立即学习“PHP免费学习笔记(深入)”;
- 稳妥写法:
if (is_array($var)) { foreach($var as $k => $v) { ... } } - 如果
$var来自外部(如$_GET、API 返回),更要加判断——哪怕文档说“返回数组”,实际可能为null或false(比如 cURL 请求失败) - 用
@foreach抑制警告?不推荐。错误被吞掉后,后续逻辑可能静默出错,调试困难
实际中,is_array() 的调用成本极低,但漏判导致的 Warning 或逻辑错位,远比多一次类型检查代价高。尤其在处理用户输入、API 响应、配置文件解析时,多一层判断几乎零成本,却能避开大量隐性故障。



















