array_filter 默认会误删 0、false、'' 等 falsy 值,因隐式调用 boolval();精准移除 null 需显式传入 $v !== null 的回调,键名默认保留,多维需递归处理,PHP 8.0+ 可用箭头函数简化。

array_filter 是 PHP 移除数组中 null 值最常用也最直接的方式,但它默认行为容易踩坑——不传回调函数时会同时删掉 0、false、''(空字符串)等“falsy”值,而你可能只想剔除 null。
为什么 array_filter($arr) 会误删 0 和 false?
因为默认使用 boolval() 做隐式判断,所有 PHP 中的 falsy 值都会被过滤。比如:
$arr = [0, 1, null, false, '', 'hello']; var_dump(array_filter($arr)); // 输出:[1 => 1, 5 => 'hello'] —— 0、false、'' 全没了
这不是你想要的。要精准移除 null,必须显式提供过滤逻辑。
只删 null,保留 0、false、'' 的写法
用匿名函数严格比较是否为 null,注意用全等 === 避免类型转换干扰:
立即学习“PHP免费学习笔记(深入)”;
$arr = [0, 1, null, false, '', 'hello'];
$result = array_filter($arr, function($v) {
return $v !== null;
});
// $result = [0 => 0, 1 => 1, 3 => false, 4 => '', 5 => 'hello']
关键点:
- 必须用
$v !== null,不能用!$v或$v != null - 返回
true的元素被保留,false的被剔除 - 键名默认保留,如需重排索引,包一层
array_values()
批量处理多维数组里的 null
array_filter 默认只作用于一维。遇到嵌套数组,得递归处理:
function remove_null_recursive($arr) {
return array_map(function($v) {
return is_array($v) ? remove_null_recursive($v) : $v;
}, array_filter($arr, function($v) { return $v !== null; }));
}
但要注意:
- 如果某子数组本身是
null,它会被外层array_filter直接干掉 - 若子数组里有
null值,会进入递归分支继续清理 - 性能敏感场景慎用深度递归,大数组建议用迭代替代
PHP 8.0+ 可用箭头函数简化写法
如果项目环境支持 PHP 8.0+,可以更简洁:
$result = array_filter($arr, fn($v) => $v !== null);
但注意:
- 箭头函数不能引用外部变量(
use),如有动态条件需回退到普通匿名函数 - IDE 或低版本 PHP 运行时会报错,上线前确认环境兼容性
真正容易被忽略的是键名保留机制——array_filter 不会自动重索引,后续用 for 循环或 array_values() 前务必检查键是否连续。











