1. 程式人生 > >巧用array_map()和array_reduce()替代foreach迴圈

巧用array_map()和array_reduce()替代foreach迴圈

1、array_reduce( $arr , callable $callback ) 使用回撥函式迭代地將陣列簡化為單一的值。

其中$arr 為輸入陣列,$callback($result , $value)接受兩個引數,$result為上一次迭代產生的值,$value是當前迭代的值。

使用array_reduce()替代foreach()迴圈最常用的一個業務場景也許就是陣列求和,比如:

$arr = array('1','2','3'); //計算陣列中數字的和
$sum = 0;
foreach($arr as $v){  //使用 foreach迴圈計算
  $sum  += $v;// echo $sum
} echo array_reduce($arr , function($result , $v){ //使用array_reduce()迭代求和 Return $result+$v; });

再比如,從資料庫中查詢出一組資料,接下來想得到他們的 id 值,拼接成類似 (1,2,3,4,5) 字串,然後在 “SELECT * WHERE id in(1,2,3,4,5) ” 處理,這時候完全可以 foreach() 陣列處理,其實也可以使用 array_reduce(),因為 array_reduce()就是“迭代地將陣列簡化為單一的值”,如下

$arr = array(
array("id"
=>1,'name'=>"a"), array("id"=>2,"name"=>"c"), array("id"=>3,"name"=>"d") ); echo array_reduce($arr , function($result , $v){ Return $result.','.$v['id']; });

在業務中遇到foreach迴圈處理,有時候我們就可以想想能不能像這樣處理。

2、array_map(callback $callback , $arr)  返回使用者自定義函式作用後的陣列。回撥函式接受的引數數目應該和傳遞給 array_map() 函式的陣列數目一致。

向array_map傳入陣列,出來的還是陣列,而不是上面array_reduce()的一個值。所以,array_map()最簡單的就是把callback函式作用到每個陣列的值上,最常見的場景就是 intval()、trim()  陣列中的值,在一些框架的原始碼中也經常見到,比如:

$arr = array('2','3','4','5');

array_map('intval' , $arr);//在拼接sql查詢的時候,很有用

array_map('htmlspecialchars' , $arr);

雖然有時候foreach完全可以達到相同的效果,但是在程式碼中使用 array_map、array_reduce還有array_filter之類的函式,可以讓程式碼更加的簡潔,而不是一個php檔案到處都是foreach迴圈。