PHP中判断数组是否为空值需递归+类型感知清洗,因empty()和array_filter()默认行为会误删0、false等有效值,多维数组须自定义cleanArray函数,JSON导出前应unset无意义null键。

PHP中判断数组是否为空值(全null/空字符串/空数组)
直接用 empty() 或 count() 无法识别「表面非空但实际全是无效值」的数组,比如 ['', null, [], false, 0]。这类数据常见于表单提交、API响应或CSV导入后未清洗的原始字段。
推荐用递归+类型感知的方式过滤:
- 先用
array_filter($arr, 'is_scalar')剔除数组、对象等复合类型(避免后续trim()报错) - 对剩余标量值统一处理:用
!is_null($v) && !is_bool($v) && trim((string)$v) !== ''判定是否为有效内容 - 注意
false和0在弱类型比较下都为false,若业务需保留数字0,必须显式排除is_int($v)
array_filter() 默认行为为什么删不干净空值?
array_filter($arr) 默认用布尔值过滤,会把 0、false、null、'' 全部干掉——这在数据清洗里常是过度清理。比如用户昵称是 "0" 或状态码字段存了 0,直接裸调用就丢数据。
安全做法是传回调函数:
立即学习“PHP免费学习笔记(深入)”;
$clean = array_filter($arr, function($v) {
if (is_string($v)) return trim($v) !== '';
if (is_numeric($v)) return true; // 保留所有数字,含 0
if (is_bool($v)) return $v === true;
return !is_null($v);
});
重点:别依赖默认回调,尤其当数组含混合类型时。
如何批量清理多维数组里的空值键?
深层嵌套时,array_filter() 只作用于当前层。要递归清理并同时删除空子数组,得自己写递归函数:
- 对每个值调用自身,返回清理后的子数组
- 清理完再用
array_filter()去掉当前层的空项(包括空子数组) - 加个开关参数控制是否删除空子数组:
array_filter($sub, 'strlen')留下非空字符串,array_filter($sub)则连空数组也删
示例关键逻辑:
function cleanArray($arr, $dropEmptySubarrays = true) {
$result = [];
foreach ($arr as $k => $v) {
if (is_array($v)) {
$v = cleanArray($v, $dropEmptySubarrays);
if ($dropEmptySubarrays && empty($v)) continue;
}
if ($v !== '' && $v !== null && !is_array($v) || !empty($v)) {
$result[$k] = $v;
}
}
return $result;
}
JSON导出前必须处理的空值陷阱
PHP数组转 json_encode() 时,null 值会变成 null,空字符串变 "",而前端可能期望统一为 undefined 或直接剔除字段。这时候不能只靠后端清理,得配合 JSON 选项和字段级策略:
- 用
JSON_FORCE_OBJECT防止索引数组变 [](避免前端误判结构) - 提前把真正无意义的
null键 unset,而不是留着让json_encode()输出null - 对可选字段,约定「不存在比
null更干净」,所以清洗阶段直接unset($arr['field'])比赋值null更稳妥
最易忽略的是浮点数 0.0 和整数 0 类型差异——json_encode() 都输出 0,但清洗时若只判断 == 0 会误杀 "0" 字符串。











