用自定义递归函数removeemptyvalues最稳妥,仅清除null、空字符串和纯空白字符串,保留0、false及非空数组。

PHP递归删除数组中的空值(包括null、''、0、false)
直接说结论:用 array_filter() 配合递归函数最稳妥,但默认行为会删掉 0 和 false——这往往不是你想要的。关键得先明确「什么是空值」:业务中通常指 null、空字符串 ''、空白字符串 "\t\n ",而 0、false、[] 往往有实际语义,不能无差别清除。
为什么不能直接用 array_filter($arr, 'strlen')
因为 strlen 对 0 返回 1(数字转字符串是 "0"),对 false 返回 0(转成空字符串),结果不稳定;更糟的是它无法处理嵌套数组。常见错误现象是:深层的 ['name' => ''] 没被清理,或者 ['count' => 0] 被误删。
- 用
array_filter($arr)默认回调会把0、false、null、''全干掉——太激进 - 用
array_filter($arr, 'is_string')又太窄,漏掉null和空白字符串 - 必须自己写判断逻辑,并在每一层递归中调用
推荐的递归清理函数(支持多维、保留0/false)
以下函数只清除 null、''、纯空白字符串,其余值(含 0、false、[])全部保留:
function removeEmptyValues($arr) {
$result = [];
foreach ($arr as $key => $value) {
if (is_array($value)) {
$cleaned = removeEmptyValues($value);
if (!empty($cleaned)) { // 子数组清完不为空才保留
$result[$key] = $cleaned;
}
} elseif ($value === null || trim((string)$value) === '') {
continue; // 跳过 null 和空白
} else {
$result[$key] = $value;
}
}
return $result;
}
使用场景:清洗 API 请求参数、表单提交数据、配置数组。注意 trim((string)$value) 能安全处理数字、布尔、对象(转成字符串后判断),避免 trim(null) 报 Warning。
容易踩的坑:递归后键名丢失、空数组残留、性能问题
常见错误现象是清理完得到 [0 => 'a', 2 => 'b'] 这种非连续数字键,或留下 ['user' => []] 这种空子数组。还有人用 json_encode/json_decode 做伪递归,遇到资源对象或闭包直接崩溃。
- 不要用
array_values()强制重排键名——除非你确定要丢弃关联键 - 子数组清理后必须用
!empty($cleaned)判断,而不是count($cleaned) > 0(后者对['' => 'x']也返回 true) - 超深嵌套(>100 层)可能触发 PHP 递归限制,生产环境建议加深度计数器和报错提示
- 大数组(>10k 元素)慎用递归,考虑迭代 + 栈模拟,避免爆栈
真正难的不是写几行递归,而是想清楚「哪些值算空」「空了要不要留着这个键」「空数组算不算有效结构」——这些必须按业务定,代码只是执行者。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











