array_filter()默认去除所有falsy值(null、false、0、""、[]),但会重排数字键;保留键名需自定义回调,如array_filter($arr, 'strlen')或function($v){return $v!==null&&$v!=='';},数值0和空数组需特别处理。

PHP 去除数组空值用 array_filter() 最稳妥
直接用 array_filter($arr) 就能去掉 null、false、0、""、[] 这些“falsy”值,但要注意它默认不保留键名——数字键会重排,关联键只删不重索引。如果你需要保留原始键(比如处理表单提交的 $_POST 数据),得加第二个参数:array_filter($arr, 'strlen') 只删空字符串;或者更精确地写回调:array_filter($arr, function($v) { return $v !== null && $v !== ''; })。
常见错误是以为 array_filter() 默认只删 null 或 '',结果把合法的 0 或 false 也干掉了。比如用户选了“数量:0”,你一过滤就没了。
- 数值型数组想留
0?必须传自定义回调,不能依赖默认行为 - 关联数组要保键名?不用额外操作,
array_filter()本身就不重排关联键 - 想同时删空白字符串和仅含空格的字符串?用
trim($v) !== ''判断
排序必须在过滤之后做,顺序不能反
先 sort() 再 array_filter() 是典型错误:排序会打乱原始结构,再过滤可能让结果不可预期;而且 sort() 会重置键名,后续如果靠键名定位数据就出问题。正确顺序永远是:过滤 → 排序。
排序函数选哪个,取决于你要什么效果:
立即学习“PHP免费学习笔记(深入)”;
- 数字升序:用
sort($arr, SORT_NUMERIC) - 字符串自然排序(如 "item2" 在 "item10" 前):用
natsort($arr),它保留键名 - 关联数组按值排序还要保键名:用
asort($arr)或arsort($arr) - 按键名排序?用
ksort($arr),但注意它只对关联键有效
性能上,array_filter() + asort() 组合比写一个大循环手动筛+排快得多,PHP 内部实现更优。
联合处理时别漏掉嵌套数组或对象
如果数组里有子数组(比如多维表单数据),array_filter() 默认只处理第一层。你看到 array_filter($arr) 没生效,很可能是数据长这样:['a' => ['', 'hello'], 'b' => null] —— 外层 '' 是字符串,被删了,但 'hello' 还在子数组里,没被触达。
这时候不能硬套一层过滤,得递归。简单方案是写个辅助函数:
function array_filter_recursive($arr) {
foreach ($arr as $k => $v) {
if (is_array($v)) {
$arr[$k] = array_filter_recursive($v);
}
if ($v === '' || $v === null || $v === []) {
unset($arr[$k]);
}
}
return $arr;
}
注意:递归版性能略低,大数据量时得权衡;另外 unset() 后键名不会自动重排,如果后续要 json_encode() 输出给前端,且前端依赖连续数字键,就得再套一层 array_values()。
JSON 输出前检查空数组是否真该被删
很多人在 API 返回前习惯性 array_filter() 一下,结果把空数组 [] 也删了,变成 null 或直接消失,前端解构时报错。PHP 中空数组是 “truthy”,但默认 array_filter() 会把它当 falsy 删掉——因为 count([]) === 0,而 0 是 falsy。
所以如果业务上“空数组”是有意义的(比如表示“暂无标签”),就得显式排除:
- 用
array_filter($arr, function($v) { return !is_array($v) || count($v) > 0; }) - 或者更安全:先过滤基本类型,再单独处理数组字段
最容易被忽略的是:前后端约定里,“空数组”和 “字段不存在” 往往语义不同。删掉空数组不是“清理”,而是“改语义”。这地方不加注释,半年后你自己都看不懂为啥接口字段突然消失了。











