array_filter

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

array_filter使用回调函数过滤数组的元素

说明

array_filter(array $array, ?callable $callback = null, int $mode = 0): array

遍历 array 数组中的每个值,并将每个值传递给 callback 回调函数。 如果 callback 回调函数返回 true,则将 array 数组中的当前值返回到结果 array 数组中。

返回结果 array 数组的键名(下标)会维持不变,如果 array 参数是索引数组,返回的结果 array 数组键名(下标)可能会不连续。 可以使用 array_values() 函数对数组重新索引。

参数

array

要遍历的数组

callback

使用的回调函数

如果没有提供 callback 回调函数,将删除数组中 array 的所有“空”元素。 有关 PHP 如何判定“空”元素,请参阅 empty()

mode

决定哪些参数发送到 callback 回调的标志:

  • ARRAY_FILTER_USE_KEY - 将键名作为 callback 回调的唯一参数,而不是值
  • ARRAY_FILTER_USE_BOTH - 将值和键都作为参数传递给 callback 回调,而不是仅传递值
默认值为 0 ,只传递值作为 callback 回调的唯一参数。

返回值

返回过滤后的数组。

更新日志

版本 说明
8.0.0 callback 现在可为空(nullable)。
8.0.0 如果 callback 接受引用传递参数,该方法将会抛出 E_WARNING

范例

示例 #1 array_filter() 示例

<?php
function odd($var)
{
    
// 返回输入整数是否为奇数(单数)
    
return $var 1;
}
function 
even($var)
{
    
// 返回输入整数是否为偶数
    
return !($var 1);
}
$array1 = ['a' => 1'b' => 2'c' => 3'd' => 4'e' => 5];
$array2 = [6789101112];
echo 
"Odd :\n";
print_r(array_filter($array1"odd"));
echo 
"Even:\n";
print_r(array_filter($array2"even"));
?>

以上例程会输出:

Odd :
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Even:
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
    [6] => 12
)

示例 #2 array_filter() 不使用 callback 参数时

<?php
$entry 
= [
    
=> 'foo',
    
=> false,
    
=> -1,
    
=> null,
    
=> '',
    
=> '0',
    
=> 0,
];
print_r(array_filter($entry));
?>

以上例程会输出:

Array
(
    [0] => foo
    [2] => -1
)

示例 #3 array_filter() 不使用 mode 参数时

<?php
$arr 
= ['a' => 1'b' => 2'c' => 3'd' => 4];
var_dump(array_filter($arr, function($k) {
    return 
$k == 'b';
}, 
ARRAY_FILTER_USE_KEY));
var_dump(array_filter($arr, function($v$k) {
    return 
$k == 'b' || $v == 4;
}, 
ARRAY_FILTER_USE_BOTH));
?>

以上例程会输出:

array(1) {
  ["b"]=>
  int(2)
}
array(2) {
  ["b"]=>
  int(2)
  ["d"]=>
  int(4)
}

注释

警告

不应该在回调函数中改变数组(如:添加、删除或销毁“unset”当前数组和里面的元素),否则此函数的行为将不可预测。

参见