array_filter
(PHP 4 >= 4.0.6, PHP 5, PHP 7) array_filter — 用回调函数过滤数组中的单元。(返回回调函数中返回true的元素,也就是过滤掉返回false的元素)
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
参数
- array: 要循环的数组
- callback:使用的回调函数
如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。更多信息见转换为布尔值。
- flag: 决定callback接收的参数形式:
ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数
ARRAY_FILTER_USE_BOTH -
返回值
返回过滤后的数组。
例子
使用回调函数时
获取数组中的奇数偶数
//奇数
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。
和 1 进行 & 运算的巧用,因为1的除了最后一位是1外,其他位置都是0,所以任何一个数字和1进行&运算,结果只有2种,要么是1,要么是0,由进行比较的数字的最后一位决定(由于1的其他位都是0,所以对位&计算后肯定是0)
不使用 callback 时的array_filter()
如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。
$entry = array(
0 => 'foo',
1 => false,
2 => -1,
3 => null,
4 => ''
);
print_r(array_filter($entry));
带 flag 标记的 array_filter()
$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。
array_map
(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:数组,遍历运行 callback 函数。
- ... 数组列表,每个都遍历运行 callback 函数。
返回值
返回数组,包含 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)是整型数字的序列。
array_map() 键(key)是 string
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"
}
}