array_filter()默认剔除falsy值但不处理"0"、" "等,需自定义回调;filter_var()不支持数组批量处理;遍历时unset()易出错;空值判断应按业务逻辑封装函数。

用 array_filter() 去掉 PHP 数组里的空值最直接
它默认就剔除 false、null、0、""、[] 这些“falsy”值,不用写循环。但要注意:数字 0 和字符串 "0" 行为不同——"0" 会被保留,0 会被删掉。
常见错误是以为它能自动处理 " "(带空格的字符串)或 "null"(字符串),其实不会。这些都算“truthy”,得手动加回调。
- 想保留
0但删掉空字符串?用array_filter($arr, 'strlen') - 想删掉空白字符串(含空格)?用
array_filter($arr, function($v) { return is_string($v) ? trim($v) !== '' : !empty($v); }) - 注意键名:默认会重排索引。要保留原键,加第三个参数
ARRAY_FILTER_USE_BOTH并自己判断
filter_var() 不适合批量清理数组元素
它单次只处理一个值,比如校验邮箱或转整型,不能直接喂整个数组。有人误写成 filter_var($arr, FILTER_SANITIZE_STRING),结果返回 false 或意外截断——因为 filter_var() 对数组不支持,PHP 会静默转成字符串再处理,基本等于废操作。
真正要用到它的场景,是遍历中对特定字段做类型过滤,比如统一转整数或去 HTML 标签:
立即学习“PHP免费学习笔记(深入)”;
array_map(function($v) {
return filter_var($v, FILTER_SANITIZE_NUMBER_INT);
}, $arr)
但别指望它替代 array_filter() 的筛选逻辑。
遍历时用 unset() 容易 key 错乱或跳过元素
一边遍历一边 unset(),PHP 的内部指针容易偏移,尤其用 foreach 时,可能漏掉下一个元素。更糟的是,如果数组有数字键,unset() 后不重索引,后续用 for($i=0; $i<count> 就会出错。</count>
- 安全做法:先收集要删的 key,再统一
unset() - 或者改用
array_values()重置索引(但仅在需要连续数字键时才必要) - 避免在
foreach中修改原数组结构,这是硬坑
空值判断逻辑必须按业务定,没有万能解
“空”不是技术概念,是业务定义。用户填了 "0" 是想存零,还是误操作?"false" 字符串是配置项还是真布尔值?这些没法靠函数自动猜。
所以实际项目里,建议把判断逻辑抽成小函数,写清楚注释:
function is_blank($v): bool {
return $v === null
|| $v === ''
|| (is_string($v) && trim($v) === '')
|| (is_array($v) && empty($v));
}
然后传给 array_filter($arr, 'is_blank')。否则后期维护时,光看一行 array_filter($arr) 根本不知道哪些值被当“空”处理了。
最常被忽略的是类型混合数组——比如接口返回的 JSON 解码后,数字可能变成字符串,"0" 和 0 在同一数组里共存,这时候用默认 array_filter() 就会产生不一致行为。











