array_filter() 默认删除所有 falsy 值(如0、""、null、false、[]、"0"),因其基于隐式布尔判断;需自定义回调才能保留特定 falsy 值如"0"或0。

因为 array_filter() 默认用 PHP 的隐式布尔判断(类似 empty()),所有 falsy 值都会被删,0 就是其中之一。
默认行为等价于 boolval($v) === true
不传回调函数时,array_filter($arr) 内部对每个值调用类似 if ($v) 的判断。PHP 中以下值都算 falsy:
null-
''(空字符串) -
0和0.0 false-
[](空数组) -
"0"(注意:empty("0") === true)
所以 array_filter([0, 1, '', null, false]) 返回 [1] —— 不是你“漏了”,是它本就设计如此。
为什么 "0" 也被删了
array_filter() 默认不区分类型,只看布尔上下文。"0" 在 if 判断中为 false,和 0 一样被干掉。这不是 bug,是 PHP 类型松散的副作用。
- 想保留
"0"?必须显式写回调,用!==严格比较,比如$v !== '' - 若业务中
"0"表示“关闭”状态,删掉就等于篡改用户意图 - 别用
==或empty()判断,它们会把"0"和0混为一谈
怎么安全过滤,只清真空白
目标:剔除 null、''、[],但保留 0、"0"、false(按需)。
- 最简写法:
array_filter($arr, fn($v) => $v !== null && $v !== '' && $v !== []) - 如果还要保留
false,就别加&& $v !== false—— 先确认false是有效业务值还是错误标记 - 要同时 trim 空格再判断?用
array_filter(array_map('trim', $arr), 'strlen'),但注意trim(null)会转成'',非字符串值慎用 - 键名默认保留,只要你不调
array_values();需要重排索引才加它
容易被忽略的细节
多维数组不会自动递归处理,array_filter() 只作用于第一层;filter_var() 或手动递归才是应对嵌套空值的正解。还有,JSON 解码后 null 和 "" 语义不同,不能一并过滤 —— 这类边界情况,光靠默认 array_filter 压根兜不住。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











