用 array_filter() 配合 trim() 是最简方案:array_filter($arr, fn($v) => trim($v) !== ''),可过滤纯空白字符串;注意 trim() 默认不处理全角空格,需显式指定字符集。

用 array_filter() 配合 trim() 是最简方案
PHP 里筛掉纯空格字符串(如 " "、"\t\n"),核心是判断「去掉首尾空白后是否为空」。直接用 array_filter($arr) 不行——它只过滤 false、0、""、null 等 falsy 值,而 " " 是 truthy 的。
正确做法是传入回调函数:
array_filter($arr, function($v) {
return trim($v) !== '';
})
这个组合能同时处理空格、制表符、换行符、全角空格等所有 Unicode 空白字符(trim() 默认行为)。
注意 array_filter() 会重置键名,需保留原索引时加 ARRAY_FILTER_USE_KEY
默认调用 array_filter() 后数组键名会变成连续数字(0,1,2…),如果原数组是关联的或依赖键名,这点容易出错。
立即学习“PHP免费学习笔记(深入)”;
- 要保留原始键名:直接用上面的写法即可,
array_filter()默认保留键名 - 误用
array_values()强制重排:会导致键名丢失,除非你明确需要数字索引 - 若需严格按值过滤但又想控制键逻辑,可改用
foreach手动构建新数组
empty(trim($v)) 和 trim($v) === '' 效果一样,但后者更直白
有人写 empty(trim($v)),它在绝大多数场景下和 trim($v) === '' 行为一致,因为 trim() 返回空字符串时 empty() 为 true;但存在一个边界情况:
-
trim("0")→"0"→empty("0")是true(PHP 特殊规则),但"0" === ''是false - 所以如果你数组里可能有字符串
"0"且希望它被保留,就不能用empty(),必须用严格比较
纯空格场景下无影响,但习惯写 trim($v) !== '' 更安全、意图更清晰。
大批量数据时,避免在回调里重复计算,提前定义匿名函数或提取逻辑
如果在循环中反复调用 array_filter(),每次创建匿名函数会有轻微开销。对百万级数组虽不致命,但可优化:
- 把回调提成变量:
$isNotEmpty = fn($v) => trim($v) !== '';,再传入array_filter($arr, $isNotEmpty) - 若逻辑复杂(比如还要过滤 null、false),建议封装成独立函数,便于复用和测试
- 注意:PHP 7.4+ 支持箭头函数,写法更紧凑;低版本请用
function($v) { ... }
真正容易被忽略的是空格类型——trim() 默认只处理 ASCII 空白(空格、\t、\n、\r、\0、\x0B),如果数据含中文全角空格( )或 Unicode 分隔符,得显式传入第二个参数,例如:trim($v, " \t\n\r\0\x0B\u{3000}")。











