最直接的方法是in_array(null, $arr, true),必须显式传入true启用严格比较,否则0、''、false会被误判为null;array_filter($arr, 'is_null')配合array_keys可定位所有null键;手动foreach配合===更可控;isset和empty不能准确判断null值。

用 in_array(null, $arr) 最直接,但要注意第三个参数
多数人第一反应是 in_array(null, $arr),它确实能查,但默认开启类型松散比较——这意味着 0、''、false 也会被当成 null 匹配上。
必须显式传入 true 作为第三个参数,启用严格比较:
if (in_array(null, $arr, true)) {
echo "数组里有真正的 null";
}
- 不加
true:`in_array(null, [0, '', false])` 返回true(错误正向) - 加
true:同上数组返回false,只有遇到字面量null才匹配 - 注意:如果数组元素是字符串
"null",它不会被识别为null,这是类型隔离的正常行为
array_filter($arr, 'is_null') 能拿到所有 null 元素的位置
如果你不只是要“有没有”,还要知道哪些键对应 null,array_filter() 配合 is_null 回调更合适:
$nullKeys = array_keys(array_filter($arr, 'is_null'));
if (!empty($nullKeys)) {
echo "null 出现在键:" . implode(', ', $nullKeys);
}
-
array_filter($arr, 'is_null')会保留原键名,只留下值为null的项 -
array_keys()提取这些项的键,方便定位 - 比遍历 +
foreach+=== null更简洁,也避免手写循环漏掉键名处理
用 foreach 手动检查最可控,适合复杂条件
当你要同时判断 null 并做其他逻辑(比如跳过某些键、记录上下文),手动遍历反而最清晰:
立即学习“PHP免费学习笔记(深入)”;
foreach ($arr as $key => $value) {
if ($value === null) {
echo "发现 null,键为:$key";
break; // 找到一个就停,或继续找全部
}
}
- 必须用
===,==会触发类型转换陷阱 - 如果数组很大且只需确认存在性,找到第一个就
break,避免无谓遍历 - 注意:PHP 中
NULL和未定义键不同——isset($arr[$key])对null值返回false,但它不能用来查“值是否为 null”
别误用 empty() 或 isset()
empty($arr) 判断整个数组是否为空,跟元素值无关;isset($arr[$key]) 在键存在但值为 null 时返回 false,容易让人误以为“键不存在”。这两者都不是查 null 值的工具。
-
empty($arr[0])对null、0、''、false都返回true,无法区分 -
isset($arr[0])对null返回false,但对未设置的键也返回false,二者行为一致,无法分辨 - 真正需要的是“这个键存在,且它的值就是
null”,只能靠array_key_exists($key, $arr) && $arr[$key] === null这类组合判断
in_array 的第三个参数,或者把 isset 当成 is_null 用。只要记住一点:查 null 就得用严格等于或专门函数,任何涉及隐式转换的操作都不可信。



















