回调函数和数组
本篇文章给大家分享的内容是关于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 class="brush:php;toolbar:false">"; print_r($d); echo "";
结果如下:
例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 */
以上是回调函数和数组的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP中深度复制数组的方法包括:使用json_decode和json_encode进行JSON编码和解码。使用array_map和clone进行深度复制键和值的副本。使用serialize和unserialize进行序列化和反序列化。

PHP数组键值翻转方法性能对比表明:array_flip()函数在大型数组(超过100万个元素)下比for循环性能更优,耗时更短。手动翻转键值的for循环方法耗时相对较长。

1、 SUM函数,用于对一列或一组单元格中的数字进行求和,例如:=SUM(A1:J10)。2、AVERAGE函数,用于计算一列或一组单元格中的数字的平均值,例如:=AVERAGE(A1:A10)。3、COUNT函数,用于计算一列或一组单元格中的数字或文本的数量,例如:=COUNT(A1:A10)4、IF函数,用于根据指定的条件进行逻辑判断,并返回相应的结果。

PHP的array_group_by函数可根据键或闭包函数对数组中的元素分组,返回一个关联数组,其中键是组名,值是属于该组的元素数组。

在PHP中执行数组深度复制的最佳实践是:使用json_decode(json_encode($arr))将数组转换为JSON字符串,然后再将其转换回数组。使用unserialize(serialize($arr))将数组序列化为字符串,然后将其反序列化为新数组。使用RecursiveIteratorIterator迭代器对多维数组进行递归遍历。

多维数组排序可分为单列排序和嵌套排序。单列排序可使用array_multisort()函数按列排序;嵌套排序需要递归函数遍历数组并排序。实战案例包括按产品名称排序和按销售量和价格复合排序。

C++中的异常处理可通过定制异常类增强,提供特定错误消息、上下文信息以及根据错误类型执行自定义操作。定义继承自std::exception的异常类,提供特定的错误信息。使用throw关键字抛出定制异常。在try-catch块中使用dynamic_cast将捕获到的异常转换为定制异常类型。实战案例中,open_file函数抛出FileNotFoundException异常,捕捉并处理该异常可提供更具体的错误消息。

PHP的array_group()函数可用于按指定键对数组进行分组,以查找重复元素。该函数通过以下步骤工作:使用key_callback指定分组键。可选地使用value_callback确定分组值。对分组元素进行计数并识别重复项。因此,array_group()函数对于查找和处理重复元素非常有用。
