回調函數和數組

不言
發布: 2023-03-23 21:06:01
原創
1840 人瀏覽過

這篇文章要分享給大家的內容是關於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同時接受鍵名與鍵值

#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。

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
 */
登入後複製


           

以上是回調函數和數組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板