在 PHP 7.3 中,array_filter 清理二维数组需明确目标并配合匿名函数:可按子数组字段是否全非空过滤整行、按指定键值条件筛选、嵌套调用清理内部空值,注意键名保留规则及 empty 对 0/"0" 的误判。

在 PHP 7.3 中,用 array_filter 清理二维数组的关键是:**明确过滤目标(键、值、子数组结构),并配合匿名函数和合适的回调逻辑**。它本身不会自动递归,需手动控制层级。
只保留子数组中所有值都不为空的项
这是最常见需求:剔除含空字符串、null、0、false 等“空值”的子数组。
注意:PHP 的“空”判断受 empty() 影响,0 和 "0" 都会被当作空——若需保留数字 0,得改用严格判断。
$data = [
['name' => 'Alice', 'age' => 25],
['name' => '', 'age' => 30],
['name' => 'Bob', 'age' => 0],
['name' => 'Charlie', 'age' => null]
];
// 过滤掉任意字段为空的整个子数组(使用 empty 判断)
$clean = array_filter($data, function ($item) {
return !empty($item['name']) && !empty($item['age']);
});
// 结果只保留 ['name'=>'Alice','age'=>25]
按指定键的值是否满足条件来过滤
比如只留 status 为 'active' 的记录,或 score 大于 60 的行。
立即学习“PHP免费学习笔记(深入)”;
- 直接访问键名即可,无需遍历子数组
- 注意键可能不存在,建议用
isset()或空合并操作符??
$users = [
['id'=>1, 'status'=>'active'],
['id'=>2, 'status'=>'inactive'],
['id'=>3, 'status'=>'active', 'role'=>'admin']
];
$activeUsers = array_filter($users, function ($u) {
return isset($u['status']) && $u['status'] === 'active';
});
// 或更简洁:
$activeUsers = array_filter($users, fn($u) => $u['status'] ?? '' === 'active');
清理子数组内部的空值(不删整行,只删字段)
array_filter 默认作用于外层数组,若想对每个子数组也做清洗(如去掉 '' 或 null 字段),需嵌套调用:
$data = [
['a'=>'', 'b'=>1, 'c'=>null],
['a'=>'x', 'b'=>0, 'c'=>2]
];
// 先清理每行内部,再过滤空行
$clean = array_filter(array_map(function ($row) {
return array_filter($row, function ($v) {
return $v !== '' && $v !== null && $v !== false;
});
}, $data));
// 结果:
// [
// ['b'=>1],
// ['a'=>'x', 'b'=>0, 'c'=>2]
// ]
⚠️ 注意:array_filter($row) 默认会重排键名(变成数字索引)。若需保留原始键,加第三个参数 ARRAY_FILTER_USE_BOTH 并手动判断,或用 array_filter($row, null, ARRAY_FILTER_USE_BOTH) 保持键不变(PHP 7.4+ 支持,7.3 不支持该 flag,所以 PHP 7.3 中稳妥写法是显式回调)。
保留键名不被重置
array_filter 默认会重置数字键,但**关联键(字符串键)默认保留**。如果你的二维数组用的是数字索引(如 [0=>[...], 1=>[...]]),又希望保持原下标,需用 array_values 重排或不用——通常保留原键更利于后续定位。
// 原数组带数字键 $data = [0 => ['id'=>1], 2 => ['id'=>2], 5 => ['id'=>3]]; $filtered = array_filter($data, fn($x) => $x['id'] > 1); // 结果键名仍是 2 和 5,不是 0,1 —— 这是预期行为
如真需要连续数字键,最后补一句 $filtered = array_values($filtered); 即可。



















