array_filter可非遍历式过滤数组:默认剔除假值并保留键名;支持自定义/匿名回调精准筛选;关联数组键名默认保留;启用ARRAY_FILTER_USE_BOTH可同时访问键值。

如果需要在PHP中对数组进行过滤操作,但又不希望使用传统的foreach循环遍历方式,则可以借助内置函数array_filter实现非遍历式筛选。以下是针对该函数的详细解析与使用方式:
一、理解array_filter的基本行为
array_filter函数通过回调函数对数组元素进行判断,仅保留使回调函数返回true的元素,原始键名默认保留。它不修改原数组,而是返回一个新数组。该函数内部由Zend引擎实现,无需用户显式编写循环逻辑。
1、定义一个包含混合值的数组,例如:$arr = [1, 0, 'hello', '', null, 42, false];
2、调用array_filter($arr),不传入回调函数时,系统自动剔除所有等价于false的值(包括0、""、null、false)。
立即学习“PHP免费学习笔记(深入)”;
3、执行后得到的新数组为[1, 'hello', 42],且键名保持为原索引:[0 => 1, 2 => 'hello', 5 => 42]。
二、使用自定义回调函数精确控制过滤条件
当需按特定规则(如数值范围、字符串长度、类型匹配等)筛选时,必须提供回调函数。该函数接收单个数组元素作为参数,并返回布尔结果,决定该元素是否保留在结果中。
1、声明回调函数,例如function is_even($n) { return $n % 2 === 0; }
2、将该函数作为第二个参数传入array_filter,如:array_filter([1,2,3,4,5], 'is_even')
3、结果返回[2 => 2, 4 => 4],注意键名未重排,仍为原始下标
三、使用匿名函数实现一次性条件过滤
避免全局函数污染,可直接在array_filter调用中嵌入匿名函数。此方式适用于简单、临时性判断逻辑,提升代码内聚性与可读性。
1、构造带闭包的调用:array_filter($data, function($item) { return is_string($item) && strlen($item) > 3; })
2、若$data为['a', 'php', 'code', 123, 'test'],则仅保留'code'和'test'
3、匿名函数可访问父作用域变量,需用use关键字显式引入
四、处理关联数组并保留键名结构
array_filter默认维持原始键名映射关系,这对关联数组尤其重要。若需重置数字索引,须额外调用array_values;若需强制保留所有键(包括空字符串或0),需注意回调函数不能依赖隐式类型转换。
1、对关联数组$assoc = ['name' => 'Alice', 'age' => 0, 'city' => 'Beijing']调用array_filter($assoc)
2、由于'age' => 0被判定为false,该键值对被移除,结果为['name' => 'Alice', 'city' => 'Beijing']
3、若需保留0值,回调函数必须显式比较,例如function($v) { return $v !== '' && $v !== null; }
五、启用ARRAY_FILTER_USE_BOTH模式访问键与值
从PHP 5.6起,array_filter支持第三个参数FLAG,设置为ARRAY_FILTER_USE_BOTH后,回调函数将同时接收$value和$key两个参数,可用于基于键名规则的过滤(如排除特定键名)。
1、定义回调:function($value, $key) { return !in_array($key, ['temp', 'backup']); }
2、调用时指定标志:array_filter($arr, $callback, ARRAY_FILTER_USE_BOTH)
3、必须显式声明回调函数接受两个参数,否则会触发警告










