欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

回调函数和数组

程序员文章站 2022-04-06 21:40:54
...
本篇文章给大家分享的内容是关于PHP的回调函数和数组 ,有着一定的参考价值,有需要的朋友可以参考一下

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 2D:
\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的值:10n的值:
2,x的值:20n的值:
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*5var_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. lemona. orange
 b. bananalemon=d=fruitorange=a=fruitbanana=b=fruit... and after:
 d. fruit: 
 lemona. fruit: 
 orangeb. fruit: 
 banana
 */

以上就是回调函数和数组的详细内容,更多请关注其它相关文章!

相关标签: 数组 函数