這篇文章要分享給大家的內容是關於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
同時接受鍵名與鍵值
同時接受鍵名與鍵值
#傳回值:傳回過濾後的陣列。
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 )
$entry = array( 0 => 'foo', 1 => false, 2 => -1, 3 => null, 4 => ''); print_r(array_filter($entry)); 结果:Array ( [0] => foo [2] => -1 )
$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 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));
结果如下:
說明: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中文網其他相關文章!