最常用方法是直接调用array_filter()过滤falsy值,但会误删0等有效数据;需精准过滤时应传自定义回调函数,如!is_null($v)&&$v!=='';多维数组须手写递归函数处理。

用 array_filter() 删除数组中的空值最常用
直接调用 array_filter() 不传第二个参数,它会自动过滤掉所有“falsy”值:包括 null、false、0、0.0、空字符串 ''、空数组 []。这是 PHP 默认行为,也是最省事的做法。
但要注意:这个“空值”是 PHP 的真假判断逻辑,不是仅指 '' 或 null。如果你只想删纯空字符串或显式 null,不能直接这么用。
- 示例:
$arr = ['a', '', null, 0, 'b']; $clean = array_filter($arr);→ 结果是['a' => 'a', '4' => 'b'],0和空字符串都被干掉了 - 键名保留原样,不会重排。需要重排用
array_values(array_filter($arr)) - 如果数组里有数字
0是有效数据(比如商品库存为 0),这种写法会误删,得换策略
只删空字符串和 null,保留 0 和 false
这时候必须传自定义回调函数,明确指定哪些值该被剔除。常见写法是用严格比较或类型判断。
- 删
''和null:array_filter($arr, function($v) { return $v !== '' && $v !== null; }) - 更稳妥一点(兼容
0.0、'0'等边界):array_filter($arr, function($v) { return !is_null($v) && $v !== ''; }) - 如果还要排除空白字符串(如
"\t\n "),加trim():!is_null($v) && trim((string)$v) !== ''
foreach + unset() 手动删,适合复杂条件或要改原数组
当你要边遍历边判断多个字段、或需保留原始键名又不想用 array_filter() 的函数式风格时,手动 unset() 更可控。
立即学习“PHP免费学习笔记(深入)”;
- 必须用引用遍历或先取键名,否则
unset()对副本无效:foreach (array_keys($arr) as $k) { if ($arr[$k] === '') unset($arr[$k]); } - 别在
foreach($arr as $k => $v)里直接unset($arr[$k]),PHP 7.4+ 虽然不会报错,但可能跳过下一个元素 - 删除后若需索引数组,最后补一句
$arr = array_values($arr);
多维数组怎么删空值?array_walk_recursive() 不行,得自己递归
array_walk_recursive() 只能读,不能修改原结构;要删嵌套里的空值,必须手写递归函数。
- 简单场景:只清最内层数值,可用
array_map()套一层array_filter(),但只管一层:array_map('array_filter', $arr) - 真正递归清理(含子数组本身为空):
function array_trim_empty($arr) { foreach ($arr as $k => $v) { if (is_array($v)) { $arr[$k] = array_trim_empty($v); if (empty($arr[$k])) unset($arr[$k]); } elseif ($v === '' || $v === null) unset($arr[$k]); } return $arr; } - 注意
empty([])为true,所以空数组也会被删掉——这是否符合你的需求,得看业务逻辑



















