PHP的array_filter函数主要用于遍历数组,将每个元素传入回调函数进行判断,保留返回true的元素,最终返回过滤后的新数组,是数组处理中非常实用的内置函数。

array_filter 基础用法
最基础的用法是不传入回调函数,此时array_filter会过滤掉数组中所有等价于false的元素,比如0、空字符串、null、false等。
<?php $arr = [1, 0, 2, '', 3, null, false, 4]; $result = array_filter($arr); print_r($result); // 输出结果:Array ( [0] => 1 [2] => 2 [4] => 3 [7] => 4 ) ?>
如果需要自定义过滤规则,可以传入回调函数,回调函数接收数组元素作为参数,返回布尔值决定该元素是否保留。
<?php
$arr = [1, 2, 3, 4, 5, 6];
// 过滤出所有偶数
$result = array_filter($arr, function($item) {
return $item % 2 == 0;
});
print_r($result);
// 输出结果:Array ( [1] => 2 [3] => 4 [5] => 6 )
?>
带额外参数的回调用法
如果需要回调函数接收更多参数,可以使用匿名函数的use语法传递外部变量,实现更灵活的过滤逻辑。
<?php
$arr = [10, 20, 30, 40, 50];
$threshold = 25;
// 过滤出大于阈值$threshold的元素
$result = array_filter($arr, function($item) use ($threshold) {
return $item > $threshold;
});
print_r($result);
// 输出结果:Array ( [2] => 30 [3] => 40 [4] => 50 )
?>
键名保留与重置
array_filter默认会保留原数组的键名,如果需要连续的键名,可以结合array_values函数使用。
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
$result = array_filter($arr, function($item) {
return $item % 2 == 0;
});
print_r($result);
// 输出结果:Array ( [b] => 2 [d] => 4 )
// 重置键名
$resetResult = array_values($result);
print_r($resetResult);
// 输出结果:Array ( [0] => 2 [1] => 4 )
?>
性能注意点
回调函数的复杂度
回调函数的执行效率直接影响array_filter的整体性能,尽量避免在回调中执行耗时的操作,比如数据库查询、复杂的字符串处理等。如果过滤逻辑需要重复计算某个固定值,建议提前计算好再通过use传入,而不是每次回调都重新计算。
<?php
$arr = range(1, 10000);
// 不好的写法:每次回调都计算一次sqrt(100)
$result1 = array_filter($arr, function($item) {
return $item > sqrt(100);
});
// 好的写法:提前计算阈值
$threshold = sqrt(100);
$result2 = array_filter($arr, function($item) use ($threshold) {
return $item > $threshold;
});
?>
大数组场景的选择
当处理超大数组(比如十万级以上元素)时,array_filter会遍历整个数组并创建新数组,内存占用会比较高。如果只需要判断数组中是否存在符合条件的元素,不需要返回所有结果,优先使用array_search或者循环提前中断,比array_filter更高效。
过滤空值的替代方案
如果只是需要过滤掉数组中的空值,除了array_filter不加回调的方式,也可以使用循环手动判断,在元素数量极多时,简单的循环比array_filter的函数调用开销更小。
| 场景 | 推荐方案 |
|---|---|
| 过滤空值且保留所有符合条件元素 | array_filter无回调 |
| 超大数组只需要判断是否存在符合条件的元素 | foreach循环+break |
| 自定义复杂过滤规则 | array_filter+合理优化的回调 |
常见误区
很多开发者会误以为array_filter的回调函数可以接收键名作为参数,实际上默认情况下回调函数只接收元素值。如果需要同时判断键名和值,可以使用array_filter的第三个参数,设置为ARRAY_FILTER_USE_BOTH,这样回调函数会接收两个参数,分别是元素值和键名。
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
// 同时过滤键名和值,保留键名为b且值大于1的元素
$result = array_filter($arr, function($value, $key) {
return $key == 'b' && $value > 1;
}, ARRAY_FILTER_USE_BOTH);
print_r($result);
// 输出结果:Array ( [b] => 2 )
?>
PHParray_filter数组过滤回调函数性能优化修改时间:2026-06-28 12:45:31