array_filter() 默认剔除所有 falsy 值,若仅需删除空字符串应使用匿名函数严格判断 $v !== '',并配合 array_values() 重置索引以避免键名不连续问题。

用 array_filter() 最简方案
array_filter() 默认会剔除所有“falsy”值,包括空字符串 ''、null、0、false。如果数组里只有字符串,且你只关心去掉空串,这个行为刚好够用。
直接调用即可:
$arr = ['a', '', 'b', 0, 'c', null]; $result = array_filter($arr); // 输出:['a', 'b', 'c'](键名保留)但注意:返回的是**保留原始键名的数组**,不是连续数字索引。如果后续要按顺序遍历或 JSON 输出,得再套一层
array_values()。
只删空字符串,不碰 0 和 false
很多业务场景里,0 是合法值(比如商品库存为 0),不能被误删。这时必须显式指定过滤逻辑:
用匿名函数严格判断是否为空字符串:
$arr = ['a', '', 'b', 0, 'c', false];
$result = array_filter($arr, function($v) {
return $v !== '';
});
// 输出:['a', 'b', 0, 'c', false](空串被剔除,其余全留)
别用 empty($v) 或 !$v ——它们会把 0、false、[] 也干掉。
要重置索引,记得加 array_values()
array_filter() 不会自动重排键名,原数组若带数字键,结果可能变成 [0 => 'a', 2 => 'b', 4 => 'c'],容易在 for 循环或前端渲染时出错。
补一步重索引:
$result = array_values(array_filter($arr, function($v) {
return $v !== '';
}));
这会得到标准的 [0 => 'a', 1 => 'b', 2 => 'c']。漏掉这步是线上常见疏忽。
性能和大数组注意事项
array_filter() 是单次遍历,O(n) 时间,对几万条数据也没压力。但如果你在循环里反复调用它处理同一个大数组,或者嵌套多层过滤,就得留意内存拷贝开销。
几个实用提醒:
- 避免写成
array_filter($arr, 'strlen')——strlen('0')返回 1,但strlen(0)会转成字符串'0'再算,结果还是 1;可读性差还隐含类型转换风险 - 如果数组深层嵌套(比如二维),
array_filter()只作用于第一层,需递归或改用array_walk_recursive() - PHP 8.0+ 支持箭头函数,可缩写为
array_filter($arr, fn($v) => $v !== ''),更紧凑
=== '' 这个判断条件才是最稳的锚点。很多人卡在“为什么 0 没了”,其实就差这一行严格比较。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











