array_filter() 默认删除所有 falsy 值(如 0、false、null、""、[]),而非仅空值;需用回调函数明确过滤条件,如 fn($v) => $v !== null && $v !== '' 才安全。

直接用 array_filter() 就行,但默认行为会删掉值为 false、0、""、null 的所有项——这不是“只去空值”,而是去所有“falsy”值,新手最容易在这里翻车。
为什么 array_filter($arr) 会误删 0 和 false
PHP 的 array_filter() 默认用内置的布尔判断逻辑,把所有 falsy 值都当“空”处理。比如:
$arr = ['a' => 'hello', 'b' => 0, 'c' => '', 'd' => null, 'e' => '0']; var_dump(array_filter($arr)); // 输出里 'b' 和 'c'、'd' 都没了,连 'e' => '0'(字符串零)还在,但 'b' => 0(整数零)被删了
这说明它不是按“是否为空字符串/是否为 null”判断,而是按“是否为 false”判断。
-
0、0.0、"0"(注意:字符串 "0" 是 truthy!)、false、null、[]、""都会被删,但规则不统一 - 如果你只想剔除
null、""(空字符串)、[](空数组),就得显式传回调函数
只去真正“空值”的安全写法:array_filter($arr, 'strlen') 不够用,改用匿名函数
strlen 只能过滤空字符串,对 null 或 [] 会触发 warning;更稳妥的是自己定义“什么是空”:
立即学习“PHP免费学习笔记(深入)”;
$arr = ['name' => 'Tom', 'age' => 0, 'city' => '', 'tags' => null, 'score' => []];
$clean = array_filter($arr, function($v) {
return $v !== '' && $v !== null && $v !== [];
});
这个逻辑明确排除三种常见空态,保留 0、false、'0' 等有效值。
- 如果还要兼容
0.0或空白字符串(如" "),加trim($v) === '' - 如果数组是多维的,
array_filter()不递归,得自己写递归或用array_walk_recursive()配合 - 注意键名保留:默认
array_filter()会重排数字键,但保持关联键;如需重索引数字键,包一层array_values()
一行简洁版(适合简单场景):array_filter($arr, fn($v) => $v !== null && $v !== '')
PHP 7.4+ 支持箭头函数,写起来干净:
$arr = ['a' => 'x', 'b' => '', 'c' => null, 'd' => 0, 'e' => '0']; $clean = array_filter($arr, fn($v) => $v !== null && $v !== ''); // 结果:['a' => 'x', 'd' => 0, 'e' => '0']
这个版本明确只踢 null 和空字符串,不碰数字、布尔、非空字符串,也不动空数组——如果你的业务里“空数组”算有效数据,就别加 $v !== []。
- 箭头函数不能引用外部变量,如需动态配置“哪些算空”,还是得用普通匿名函数
- 性能上无差别,可读性比
array_filter($arr)高得多
真正麻烦的从来不是“怎么删”,而是“删什么才算合理”——业务里 0 是有效分数还是未填写?false 是开关关闭还是数据缺失?先厘清语义,再选过滤逻辑,否则删着删着就把关键数据干掉了。











