(PHP 4 >= 4.0.6, PHP 5, PHP 7) array_filter — 用回调函数过滤数组中的单元。(返回回调函数中返回true的元素,也就是过滤掉返回false的元素)数组
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
若是没有提供 callback 函数, 将删除 array 中全部等值为 FALSE 的条目。更多信息见转换为布尔值。函数
flag: 决定callback接收的参数形式:code
ARRAY_FILTER_USE_KEY - callback接受键名做为的惟一参数three
ARRAY_FILTER_USE_BOTH -ci
返回过滤后的数组。input
获取数组中的奇数偶数回调函数
//奇数 function odd($var) { // returns whether the input integer is odd return($var & 1); } //偶数 function even($var) { // returns whether the input integer is even return(!($var & 1)); } $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); $array2 = array(6, 7, 8, 9, 10, 11, 12); echo "Odd :\n"; print_r(array_filter($array1, "odd")); echo "Even:\n"; print_r(array_filter($array2, "even"));``
采用位运算, 1的二进制比较特殊:最后一位伟1,其余位都为0,用位异或和1计算,因为1的其余位都是0,就看另一个数的最后1位是0仍是1,若是是0,则和1的最后一位&计算获得的0,不然是1。string
和 1 进行 & 运算的巧用,由于1的除了最后一位是1外,其余位置都是0,因此任何一个数字和1进行&运算,结果只有2种,要么是1,要么是0,由进行比较的数字的最后一位决定(因为1的其余位都是0,因此对位&计算后确定是0)io
若是没有提供 callback 函数, 将删除 array 中全部等值为 FALSE 的条目。function
$entry = array( 0 => 'foo', 1 => false, 2 => -1, 3 => null, 4 => '' ); print_r(array_filter($entry));
$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));
若是不用 flag 参数,而且function($v){},参数只有一个,是数组的值。因此回调函数中,能够单个使用key,单个使用value,同时使用key和value。
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
array_map — 为数组的每一个元素应用回调函数
array_map ( callable $callback , array $array1 [, array $... ] ) : array
array_map():返回数组,是为 array1 每一个元素应用 callback函数以后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,二者必须同样
返回数组,包含 callback 函数处理以后 array1 的全部元素。
//全局函数 function cube($n) { return($n * $n * $n); } $a = array(1, 2, 3, 4, 5); $b = array_map("cube", $a); //匿名函数 $func = function($value) { return $value * 2; }; print_r(array_map($func, range(1, 5)));
function show_Spanish($n, $m) { return("The number $n is called $m in Spanish"); } $a = array(1, 2, 3, 4, 5); $b = array("uno", "dos", "tres", "cuatro", "cinco"); $c = array_map("show_Spanish", $a, $b); print_r($c);
传入两个及以上的数组时,它们元素数量将会相同。由于回调函数会并行地处理相互对应的元素。 若是几个数组的元素数量不一致:空元素会扩展短那个数组,直到长度和最长的数组同样。
此函数有个有趣的用法:传入 NULL 做为回调函数的名称,将建立多维数组(一个数组,内部包含数组。)
$a = array(1, 2, 3, 4, 5); $b = array("one", "two", "three", "four", "five"); $c = array("uno", "dos", "tres", "cuatro", "cinco"); $d = array_map(null, $a, $b, $c); print_r($d);``
以上例程会输出:
Array ( [0] => Array ( [0] => 1 [1] => one [2] => uno ) [1] => Array ( [0] => 2 [1] => two [2] => dos ) [2] => Array ( [0] => 3 [1] => three [2] => tres ) [3] => Array ( [0] => 4 [1] => four [2] => cuatro ) [4] => Array ( [0] => 5 [1] => five [2] => cinco ) )
若是仅传入一个数组,键(key)会保留;传入多个数组,键(key)是整型数字的序列。
arr = array("stringkey" => "value"); function cb1($a) { return array ($a); } function cb2($a, $b) { return array ($a, $b); } var_dump(array_map("cb1", $arr)); var_dump(array_map("cb2", $arr, $arr)); var_dump(array_map(null, $arr)); var_dump(array_map(null, $arr, $arr)); ?>
以上例程会输出:
array(1) { ["stringkey"]=> array(1) { [0]=> string(5) "value" } } array(1) { [0]=> array(2) { [0]=> string(5) "value" [1]=> string(5) "value" } } array(1) { ["stringkey"]=> string(5) "value" } array(1) { [0]=> array(2) { [0]=> string(5) "value" [1]=> string(5) "value" } }