php 7.1 的 array_filter() 不支持多维数组递归过滤,需手动实现递归函数,明确空值标准(如仅删 null、''、[]),并安全处理嵌套、标量与对象,避免类型错误和引用问题。

PHP 7.1 中 array_filter() 默认只作用于一维数组,对多维数组中的空值(如 null、''、0、false 等)无法自动递归清理。要真正“深层过滤”,需手动实现递归逻辑,同时注意 PHP 7.1 的类型特性(如不能对 null 或非数组调用 array_keys())。
明确“空值”的过滤标准
PHP 中“空”含义模糊,array_filter($arr) 默认会移除所有“falsy”值(false、0、0.0、""、null、[]),但业务中常需保留 0 或 "0"。建议先定义规则:
- 只删
null、''、[](空数组),保留0、"0"、false - 或严格按业务:如
trim($v) === ''才算空字符串 - 避免直接用
!$v,它会误删0和"0"
手写递归过滤函数(兼容 PHP 7.1)
以下函数安全处理嵌套数组、标量、对象(跳过对象以避免意外),并支持自定义判断逻辑:
function array_filter_recursive($array, callable $filter = null) {
if (!is_array($array)) {
return $array;
}
// 默认过滤规则:移除 null、''、[](不删 0、false、"0")
$defaultFilter = function ($value) {
if ($value === null) return false;
if (is_string($value) && $value === '') return false;
if (is_array($value) && empty($value)) return false;
return true;
};
$filter = $filter ?: $defaultFilter;
$result = [];
foreach ($array as $key => $value) {
// 先递归处理子数组
$filteredValue = is_array($value)
? array_filter_recursive($value, $filter)
: $value;
// 再对当前层级做过滤判断(注意:此时 $filteredValue 可能是已处理的数组)
if ($filter($filteredValue)) {
$result[$key] = $filteredValue;
}
}
return $result;
}
使用示例:
$data = [
'name' => '',
'age' => 0,
'tags' => ['php', '', null],
'meta' => ['id' => null, 'score' => 100, 'opts' => []],
];
$clean = array_filter_recursive($data);
// 结果:['age' => 0, 'tags' => ['php'], 'meta' => ['score' => 100]]
处理特殊情况:保留键名、跳过对象、避免引用问题
PHP 7.1 不支持匿名函数内 use 引用变量(除非显式声明),且需防止修改原数组。注意几点:
- 函数内部用
foreach而非array_map + array_filter组合,避免多次遍历 - 不修改原数组,始终返回新数组(符合函数式习惯)
- 遇到对象(
is_object($v))直接跳过递归,避免报错;如需处理对象,应单独实现filterObject() - 若需保留数字键连续,最后可加
array_values($result),但通常关联键更有意义
替代方案:用 JSON 编解码(简单场景)
如果数据结构纯数组/标量(无资源、闭包、对象),可用 JSON 中转快速过滤空值(利用 JS 的宽松解析):
function array_filter_json($array) {
$json = json_encode($array, JSON_FORCE_OBJECT);
// 移除 "null"、""、[] 对应的字段(需正则或解析后处理,不推荐复杂逻辑)
// 更稳妥做法:解码为 stdClass 后递归清理,再转回数组
$decoded = json_decode($json, true);
return array_filter_recursive($decoded);
}
⚠️ 注意:JSON 会丢失 0 和 false 的类型区分(都变成 false),且性能不如原生 PHP 递归,仅作思路参考。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











