array_filter() 默认用松散比较将0、"0"等判为false而过滤;需自定义回调函数,用===严格判断null、空字符串(含空白)、空数组,保留0和"0"等合法值。

PHP array_filter() 默认行为为什么删不掉 0 和 "0"
因为 array_filter() 默认用「松散比较」判断真假,0、"0"、""、null、false 全部被当作 false 过滤掉。但业务中常需保留 0(比如商品库存为 0)或字符串 "0"(比如状态码),这时候必须关掉默认逻辑。
怎么用回调函数实现严格非空过滤
传入自定义回调,显式检查是否为 null、空数组、空字符串(不含 "0")、或全空白字符,同时放过 0、false、0.0 等合法值:
$arr = [0, "0", "", "hello", null, false, [], ["a"], " "];
$result = array_filter($arr, function($v) {
if ($v === null) return false;
if (is_string($v) && trim($v) === '') return false;
if (is_array($v) && count($v) === 0) return false;
return true;
});
这样 0 和 "0" 会被保留,"" 和 " " 被剔除。
想保留 false 但剔除 null 和空字符串?注意类型判断顺序
false === null 是 false,但松散比较 false == null 是 true,所以必须用 ===。常见错误是写成 !$v 或 empty($v) —— 它们都会把 false 当空处理。
立即学习“PHP免费学习笔记(深入)”;
-
empty($v)判定false、0、"0"、""、null、[]全为真(即“空”),不能用于严格场景 -
!$v是松散取反,!0、!"0"、!null全为true,同样不可靠 - 真正安全的是组合判断:
$v !== null && !is_string($v) && !is_array($v) || (is_string($v) && trim($v) !== '') || (is_array($v) && !empty($v)),但建议封装成函数复用
性能与兼容性提醒:别在大数组里用 trim() + is_string() 频繁判断
如果数组元素超 10 万,且大量是整数或布尔值,每次调用 is_string() 和 trim() 会拖慢速度。可先用 gettype($v) 快速分流:
$result = array_filter($arr, function($v) {
$type = gettype($v);
if ($type === 'string') return trim($v) !== '';
if ($type === 'array') return !empty($v);
if ($type === 'NULL') return false;
return true; // 保留 int, double, bool, object 等
});
注意 gettype() 返回字符串如 "integer"、"boolean",不是常量;is_*() 函数内部有优化,但混合调用时仍建议按类型分路处理。
严格过滤的边界 case 很多,比如 "0.0"、"\0"、0.0 是否算空,得根据字段语义定——没有银弹,只有贴着业务逻辑写判断。










