应使用自定义回调的array_filter(),如array_filter($arr, function($v) { return $v !== '' && $v !== null && $v !== false; }),可精准剔除指定空值并保留0和"0"。

PHP怎么安全地去掉数组里的空值(包括null、''、0、false)
直接用 array_filter() 会踩坑——它默认把 0、false、'' 全当空值过滤掉,但业务里常要保留数字 0 或字符串 "0"。
真正可控的做法是传一个明确的回调函数:
array_filter($arr, function($v) {
return $v !== '' && $v !== null && $v !== false;
});
- 只剔除
''、null、false,0和"0"都留下 - 如果还要保留
0.0或0.00,得加is_numeric($v) && $v == 0判断分支 - 注意:
array_filter()不会重排键名,返回的是带缺口的关联数组;需要连续数字下标就套一层array_values()
为什么不能直接用 trim() + empty() 组合去空字符串
empty() 在 PHP 中对 0、"0"、[]、false 全返回 true,语义太宽泛;而 trim() 只处理首尾空白,对 null 或 false 会触发警告。
- 对
null调用trim()→Warning: trim() expects parameter 1 to be string - 对
false调用trim()→ 自动转成空字符串"",再被empty()判为真,逻辑错乱 - 正确姿势是先用
is_string()或is_scalar()做类型守门,再决定是否trim()
自定义函数怎么兼容 PHP 7 和 PHP 8 的严格模式
PHP 8 开始对 array_filter() 回调的返回值类型更敏感,且 NULL 作为回调参数会被拒绝;同时,isset() 对 null 和未定义键行为一致,但对 0、false 不敏感。
立即学习“PHP免费学习笔记(深入)”;
- 推荐写法:用
is_null()明确判断null,别依赖!$v - 避免在回调里写
return $v;这种隐式转换,显式写return $v !== null && $v !== ''; - 如果函数要支持递归清理多维数组,记得加
is_array()分支,否则array_filter()会把子数组整个丢掉
扩展开发时怎么让自定义去空函数可配置“哪些算空”
硬编码判断逻辑没法复用,尤其当不同接口要求不同——比如用户字段允许 "0",但金额字段不允许空字符串也不允许 "0"。
- 把“空值集合”抽成参数:
function cleanArray($arr, array $empties = ['','null','false']) - 内部用
in_array($v, $empties, true)或 switch 匹配,比一堆||更易维护 - 注意:PHP 扩展中传入的
null在 C 层是Z_TYPE_P(zv) == IS_NULL,别和 PHP 层的字符串"null"混淆
{"age": "0"} 和 {"age": 0} 在 PHP 里都是 0,但清洗逻辑可能要区分来源。











