本篇文章给大家分享的内容是关于PHP的回调函数和数组 ,有着一定的参考价值,有需要的朋友可以参考一下
array_filter(),array_map() ,array_reduce(),array_walk()的用法比较
说明: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 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));结果如下:

说明: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返回值
说明: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
*/
以上就是回调函数和数组的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号