array_reduce — 用回調函數迭代地將數組簡化為單一的值
給定一個數組:
$ar = array(1,2,3,4,5);
如果要求得這個數組中各個元素之和。
方法一、
很自然的用foreach實現
$sum = 0; foreach ($ar as $v) { $sum+=$v; } echo $sum;
方法二、
我們可以用array_reduce實現。它是專門用來迭代數組的。該函數最多接收三個參數。
第一個參數接收數組
第二個參數函數名,也可以是匿名函數,函數有兩個參數,分別代表$result和$item
第三個參數(可選),該參數將被當成是數組中的第一個值來處理,或者如果數組為空的話就作為最終返回值。
function leijia($a,$b){ $a+=$b; return $a; } $result = array_reduce($ar ,leijia); echo $result;
繼續優化,在PHP5.3以上中可以用匿名函數了。使代碼更精簡。
$result = array_reduce($ar ,function($a,$b){ $a+=$b; return $a; });
array_reduce的強大不僅如此。看下面的例子。將數組$arr的首個元素彈出,作為初始值,避免min($result['min'], $item['min'])中$result為空。
否則最終結果min是空的。
$arr = array( array('min' => 1.5456, 'max' => 2.28548, 'volume' => 23.152), array('min' => 1.5457, 'max' => 2.28549, 'volume' => 23.152), array('min' => 1.5458, 'max' => 2.28550, 'volume' => 23.152), array('min' => 1.5459, 'max' => 2.28551, 'volume' => 23.152), array('min' => 1.5460, 'max' => 2.28552, 'volume' => 23.152), ); $initial = array_shift($arr); $t = array_reduce($arr, function($result, $item) { $result['min'] = min($result['min'], $item['min']); $result['max'] = max($result['max'], $item['max']); $result['volume'] += $item['volume']; return $result; }, $initial);
總之,這種寫法比foreach更優雅,更少的定義變量。推薦使用。
