php 8.1 中 array_filter 默认仍用 empty() 过滤 falsy 值,需自定义回调剔除 null、空/纯空白字符串及空数组,保留 0/"0"/false;默认保留键名,多维需递归处理,对象资源须类型守卫。

在 PHP 8.1 中,array_filter 本身没有新行为变化,但默认过滤逻辑依然沿用 empty() 规则——这意味着直接调用 array_filter($arr) 会误删 0、"0"、false、null、''、[] 等所有 falsy 值。而业务中真正需要“过滤空值”,通常只指 null、空字符串 ''、纯空白字符串(如 "\t\n ")或空数组 [],其余如数字 0、字符串 "0"、布尔 false 往往是有效数据。
只清空字符串和 null,保留 0、"0"、false
这是最常见需求:剔除真正无意义的输入,不碰合法数值或状态标记。
- 用严格比较判断
null和空字符串:$v !== null && $v !== '' - 若还要过滤纯空白(如用户只输空格),加上
!is_string($v) || trim($v) !== ''——非字符串类型直接放过,字符串则看去空后是否为空 - 示例代码:
$clean = array_filter($arr, fn($v) => $v !== null && (!is_string($v) || trim($v) !== ''));
需保留原始键名,避免重索引错误
array_filter 默认保留键名,这点在 PHP 8.1 中未改变。但很多人顺手加 array_values() 导致键名丢失,尤其处理关联数组(如表单字段、API 返回结构)时会出问题。
- 不加
array_values():键名维持原样,适合后续按字段名取值 - 加了
array_values():强制变成连续数字索引,仅在明确需要顺序列表时才用 - 检查是否真要重排:比如
foreach ($clean as $key => $val)能正常工作,就无需重索引
多维数组要递归过滤
array_filter 不递归,PHP 8.1 依然如此。遇到嵌套结构(如 ['user' => ['name' => '', 'age' => 0]]),默认只清理第一层。
- 手动写递归函数,对每个子项再调用
array_filter+ 同样的回调 - 或用
RecursiveIteratorIterator配合自定义逻辑,但更复杂 - 简单场景推荐递归函数,例如:
function filter_recursive($arr, $callback) { return array_map(fn($v) => is_array($v) ? filter_recursive($v, $callback) : $v, array_filter($arr, $callback)); }
注意对象、资源和特殊类型
PHP 8.1 中,array_filter 对对象和资源仍不做特殊处理。若数组含对象实例或 resource 句柄,回调里需额外判断类型,避免调用 trim() 或比较 === '' 报错。
- 安全写法:先用
is_scalar($v)或is_string($v)做类型守卫 - 对对象可考虑调用
__toString()或检查特定属性,但需业务明确语义 - 资源类型(如 file handle)一般不应出现在待过滤数组中,建议前置清理
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











