本篇文章给大家分享的内容是关于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。
callback:mixed 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
*/
以上就是回调函数和数组的详细内容。