巧用array_map()和array_reduce()替代foreach循環

一、array_reduce( $arr , callable $callback ) 使用回調函數迭代地將數組簡化爲單一的值。php

其中$arr 爲輸入數組,$callback($result , $value)接受兩個參數,$result爲上一次迭代產生的值,$value是當前迭代的值。html

使用array_reduce()替代foreach()循環最經常使用的一個業務場景也許就是數組求和,好比:sql

1 $arr = array('1','2','3'); //計算數組中數字的和
2 $sum = 0;
3 foreach($arr as $v){  //使用 foreach循環計算&lt;/p&gt;<br />
4 $sum  += $v;// echo $sum
5 }
6 echo array_reduce($arr , function($result , $v){ //使用array_reduce()迭代求和
7  Return $result+$v;
8 });

再好比,從數據庫中查詢出一組數據,接下來想獲得他們的 id 值,拼接成相似 (1,2,3,4,5) 字符串,而後在 「SELECT * WHERE id in
(1,2,3,4,5) 」 處理,這時候徹底能夠 foreach() 數組處理,其實也可使用 array_reduce(),由於 array_reduce()就是「迭代地將數組簡化爲單一的值」,以下:數據庫

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

在業務中遇到foreach循環處理,有時候咱們就能夠想一想能不能像這樣處理。數組

二、array_map(callback $callback , $arr) 返回用戶自定義函數做用後的數組。回調函數接受的參數數目應該和傳遞給 array_map() 函數的數組數目一致。app

向array_map傳入數組,出來的仍是數組,而不是上面array_reduce()的一個值。因此,array_map()最簡單的就是把callback函數做用到每一個數組的值上,最多見的場景就是 intval()、trim() 數組中的值,在一些框架的源碼中也常常見到,好比:框架

1 $arr = array('2','3','4','5');
2 array_map('intval' , $arr);//在拼接sql查詢的時候,頗有用
3 array_map('htmlspecialchars' , $arr);
View Code

雖然有時候foreach徹底能夠達到相同的效果,可是在代碼中使用 array_map、array_reduce還有array_filter之類的函數,可讓代碼更加的簡潔,而不是一個php文件處處都是foreach循環。「這並不是炫耀什麼奇技淫巧,這只是PHP本身的正常的方式而已」。函數

//array_map — 將用戶自定義的函數做用到數組的每個值上,並返回函數做用後的帶有新值的數組       
    //爲數組中的每個應用回調函數 返回做用後的數組
    //
    //
    //array_walk - 使用用戶自定義的函數對數組中的每個元素作回調處理  返回boolean
    function chengji($v){
        return $v*$v;
    }

    $arr = array(1,2,3,4,5,6);
    $arr1 = array_map('chengji',$arr);
    var_dump($arr,$arr1);
    // 
    // 
    //array_reduce()  使用自定義函數迭代地將數組簡化爲單一的值
    $a = array_reduce($arr,function($res,$v){
        return $res.$v.',';
    });


    $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
    //傳引用,改變了所傳參數組
    function test_alter(&$item1, $key, $prefix)
    {
        $item1 = "$prefix: $item1";
    }

    function test_print($item2, $key)
    {
        echo "$key. $item2<br />\n";
    }

    echo "Before ...:\n";
    //單數組
    array_walk($fruits, 'test_print');

    

    //帶額外參數
    array_walk($fruits, 'test_alter', 'index');
    echo "... and after:\n";

    array_walk($fruits, 'test_print');

 參考:http://blog.csdn.net/u013372487/article/details/51568629ui

相關文章
相關標籤/搜索