array_filter() 默认过滤所有 falsy 值(0、"0"、false、null、''、[]),非仅空值;应显式传回调函数精准过滤,避免误删合法数据如 0;混用 array_diff() 易丢键名,多维空值需递归+类型判断,表单处理推荐 filter_var() 配合 array_filter_use_both。

array_filter() 默认行为会过滤掉 0、"0"、false、null、'' 等“falsy”值
很多人以为 array_filter() 只去空字符串或 null,其实它默认用 PHP 的隐式布尔判断——这意味着 0、"0"、false、[](空数组在布尔上下文中为 false)全会被删掉,哪怕业务上它们是合法数据。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 明确传入回调函数,只过滤你真正在意的“空”:比如只去
null和'',保留0和"0" - 别依赖默认行为处理表单或 API 返回的混合数值型字段
- 示例:
$data = ['a' => 0, 'b' => '', 'c' => null, 'd' => 'hello'];<br>$filtered = array_filter($data, function($v) {<br> return $v !== null && $v !== '';<br>});<br>// 结果:['a' => 0, 'd' => 'hello']
array_diff() 和 array_filter() 混用时键名丢失问题
array_diff() 返回的是重排键名的索引数组,即使输入是关联数组;而 array_filter() 默认保留原始键名。两者混用容易导致逻辑错乱,尤其在需要保持键映射关系的场景(如配置合并、字段校验)。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
array_filter()时加第三个参数ARRAY_FILTER_USE_BOTH才能安全配合键操作 - 若必须用
array_diff()去空,先用array_values()或手动重建键,避免后续foreach中键名意外消失 - 常见错误现象:
isset($result['user_id'])返回 false,但打印发现值其实存在——只是键被重置成数字了
多维数组中空值判断不能只靠 empty() 或 == ''
empty($arr['key']) 对嵌套结构无效,且 empty([]) 为 true、empty(['' => '']) 也为 true,但后者明显不是“空数组”的语义。更麻烦的是,null、0、false 在深层字段里混在一起时,简单比较极易漏判或误删。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 写递归清理函数时,优先用
is_null()+is_string()+trim()组合判断字符串类空值 - 对数组类型,用
is_array($v) && count($v) === 0替代empty($v),避免把[0 => null]当空 - 注意 JSON 解码后
null和缺失字段的区别:PHP 里json_decode('{"a":null}', true)产生['a' => null],而json_decode('{"b":1}', true)根本没有a键
filter_var() 配合 ARRAY_FILTER_USE_BOTH 处理表单数据更可靠
用户提交的表单字段常含空白字符、全角空格、不可见控制符,单纯用 trim() 不够。直接上 array_filter() 又容易误伤数值字段,这时用 filter_var() 显式声明过滤规则更可控。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 对字符串字段统一用
filter_var($v, FILTER_SANITIZE_STRING)(PHP 8.1+ 改为FILTER_SANITIZE_SPECIAL_CHARS)再判断是否为空 - 配合
ARRAY_FILTER_USE_BOTH可区分字段类型:$clean = array_filter($_POST, function($v, $k) {<br> if (in_array($k, ['email', 'name'])) {<br> return is_string($v) && trim($v) !== '';<br> }<br> return true; // 其他字段不过滤<br>}, ARRAY_FILTER_USE_BOTH); - 别在过滤前就做
json_encode()或serialize(),会导致字符串化后所有值变string类型,失去原始类型语义
status: 0 表示禁用)。这类逻辑一旦写死在通用过滤函数里,排查起来非常隐蔽。











