回调函数和数组

array_filter()array_map()array_reduce()array_walk()的用法比较

array_filter  用回调函数过滤数组中的单元

说明:array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中,否则,将不返回任何值给结果数组。数组的键名保留不变。

参数说明:

array:要循环的数组

callback:使用的回调函数

 如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。

flag:决定callback接收的参数形式 

  • ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数
  • ARRAY_FILTER_USE_BOTH - callback同时接受键名和键值

返回值:返回过滤后的数组。

例子1:

function odd($var)
{
    return($var & 1);
}
function even($var)
{
    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 "<br />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 )

分析:&是PHP的与运算,当数组中的值传递进去,根据二进制的形式和...0000 0001(前面多少个0和操作系统有关,不懂的去补补基础知识)进行与运算,如果结果true,则把传递进来的值结果返回给结果数组。

例2:没有回调函数,则数组中的值为true,就把数组中的值返回给结果数组

$entry = array(
    0 => 'foo',
    1 => false,
    2 => -1,
    3 => null,
    4 => ''
);
print_r(array_filter($entry));
结果:
Array ( [0] => foo [2] => -1 )

例3:如果只有键值,则回调函数接收一个键值即可。如果同时包含键值对,第一个参数接收值,第二个值才接收键值

$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));
结果:
D:\studySoftware\wamp64\www\test.php:5:
array (size=1)
  'b' => int 2
D:\studySoftware\wamp64\www\test.php:8:
array (size=2)
  'b' => int 2
  'd' => int 4
array_map  为数组的每个元素应用回调函数

说明:array array_map ( callable $callback , array $array1 [, array $... ] )

array_map():返回数组,是为 array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。

参数说明:

callback回调函数,应用到每个数组里的每个元素。

array1数组,遍历运行 callback 函数。

...数组列表,每个都遍历运行 callback 函数。

返回值:返回数组,包含 callback 函数处理之后 array1 的所有元素。

例1:

function cube($n)
{
    return($n * $n * $n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
结果:
Array ( [0] => 1 [1] => 8 [2] => 27 [3] => 64 [4] => 125 )

例2:如果几个数组的元素数量不一致:空元素(null)会扩展短那个数组,直到长度和最长的数组一样。

function cube($n,$x){
    echo "n的值:{$n},x的值:{$x}<br />";
    return ($n + $x);
}
$a = array(1,2,3,4,5);
$b = array(10,20);
$c = array_map("cube",$a,$b);
print_r($c);
/*
结果:
n的值:1,x的值:10
n的值:2,x的值:20
n的值:3,x的值:
n的值:4,x的值:
n的值:5,x的值:
Array ( [0] => 11 [1] => 22 [2] => 3 [3] => 4 [4] => 5 ) 
*/

例3:此函数有个有趣的用法:传入 NULL 作为回调函数的名称,将创建多维数组(一个数组,内部包含数组。)

$a = array(1, 2, 3);
$b = array("one", "two", "three");
$c = array("uno", "dos", "tres");

$d = array_map(null, $a, $b, $c);
echo "<pre>";
print_r($d);
echo "</pre>";

结果如下:


例4:如果仅传入一个数组,键(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_reduce  用回调函数迭代地将数组简化为单一的值

说明:mixed array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] )

array_reduce() 将回调函数 callback 迭代地作用到 array 数组中的每一个单元中,从而将数组简化为单一的值。

参数:

array输入的 array。

callbackmixed callback ( mixed $carry , mixed $item )

       carry:携带上次迭代里的值; 如果本次迭代是第一次,那么这个值是 initial

     item携带了本次迭代的值。

initial如果指定了可选参数 initial,该参数将在处理开始前使用,或者当处理结束,数组为空时   的最后一个结果(也就是说当参数array为空时,initial作为array_reduce()的返回值)。

官网例子:

function sum($carry, $item)
{
    $carry += $item;
    return $carry;
}
function product($carry, $item)
{
    $carry *= $item;
    return $carry;
}
$a = array(1, 2, 3, 4, 5);
$x = array();
var_dump(array_reduce($a, "sum")); // int(15)
var_dump(array_reduce($a, "product", 10)); // int(1200), because: 10*1*2*3*4*5
var_dump(array_reduce($x, "sum", "No data to reduce")); // string(17) "No data to reduce"

这里讨论array为空的情况:

function sum($carry, $item)
{
    echo "如果这里执行了,就打印...";
    return $carry;
}
$x = array();
print_r(array_reduce($x, "sum",array("a","b")));
//结果:Array ( [0] => a [1] => b )
可以看出,当数组为空的时候,回调函数根本就没有执行,而是把 initial作为array_reduce返回值

array_walk  使用用户自定义函数对数组中的每个元素做回调处理

说明:bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )

将用户自定义函数 funcname 应用到 array 数组中的每个单元。

array_walk() 不会受到 array 内部数组指针的影响。array_walk() 会遍历整个数组而不管指针的位置。

参数说明:

array输入的数组。

callback典型情况下 callback 接受两个参数。array 参数的值作为第一个,键名作为第二个

Note:

如果 callback 需要直接作用于数组中的值,则给 callback 的第一个参数指定为引用。这样任何对这些单元的改变也将会改变原始数组本身。

Note:

参数数量超过预期,传入内置函数 (例如 strtolower()), 将抛出警告,所以不适合当做 funcname


只有 array 的值才可以被改变,用户不应在回调函数中改变该数组本身的结构。例如增加/删除单元,unset 单元等等。如果 array_walk() 作用的数组改变了,则此函数的的行为未经定义,且不可预期。


userdata如果提供了可选参数 userdata,将被作为第三个参数传递给 callback funcname


返回值:成功时返回 TRUE, 或者在失败时返回 FALSE


例子:

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana");
function test_alter(&$item1, $key, $prefix)
{
    echo "$item1=$key=$prefix<br/>";
    $item1 = "$prefix: $item1";
}
function test_print($item2, $key)
{
    echo "$key. $item2<br />\n";
}
echo "Before ...:<br />";
array_walk($fruits, 'test_print');
array_walk($fruits, 'test_alter', 'fruit');
echo "... and after:<br />";
array_walk($fruits, 'test_print');
/*
Before ...:
d. lemon
a. orange
b. banana
lemon=d=fruit
orange=a=fruit
banana=b=fruit
... and after:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
*/

猜你喜欢

转载自blog.csdn.net/weixin_37909391/article/details/79936197