array_filter() 默认剔除所有 falsy 值(null、false、0、""、[]、0.0),但保留字符串"0"和"false";需保留0和false时应传自定义回调,多维数组需手动递归处理。

用 array_filter() 去空值最直接
array_filter() 默认行为就是剔除所有“falsy”值(null、false、0、""、[]、0.0),适合多数去空场景。但要注意:它会保留 "0"(字符串零)和 "false"(字符串),因为它们是 truthy。
- 如果只要删
null、""、[],而想保留0和false,就得传自定义回调函数 - 原数组键名默认不重排;需要连续数字索引,得再套一层
array_values() - 对多维数组无效,只处理第一层
保留 0 和 false 时怎么写回调
明确列出你要剔除的值,避免误删。比如只清空 null、空字符串、空数组、空白字符串:
$clean = array_filter($arr, function($v) {
return !is_null($v) && $v !== '' && $v !== [] && !is_string($v) || trim($v) !== '';
});
更稳妥的做法是用 trim() + 类型判断组合,尤其当数据来自表单或 JSON 解析时,常混入全空格字符串。
多维数组怎么递归去空
array_filter() 不递归,必须手动遍历。常见错误是直接在回调里调 array_filter() 却忘了处理子数组类型:
立即学习“PHP免费学习笔记(深入)”;
- 先判断是否为数组,是则递归调用自身函数
- 非数组再做值判断(如
!empty($v)或更精确的条件) - 递归后记得对子数组结果再
array_values(),否则键名错乱
注意:empty() 在递归中慎用,它把 0、"0"、false 都当空——和业务预期可能不符。
性能与兼容性提醒
PHP 7.4+ 支持箭头函数,可简写回调,但老项目别硬上;array_filter() 本身性能不错,但嵌套深、元素多时,递归版会明显变慢。
真正容易被忽略的是:JSON 解析后的空对象 {} 会变成 stdClass 实例,empty() 判为 false,但 array_filter() 默认不处理对象——得提前 json_decode($json, true) 强制转成关联数组,否则筛不掉。











