• 巧用array_map()和array_reduce()替代foreach循环


    1、array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值。

    其中$arr 为输入数组,$callback($result , $value)接受两个参数,$result为上一次迭代产生的值,$value是当前迭代的值。

    使用array_reduce()替代foreach()循环最常用的一个业务场景也许就是数组求和,比如:

    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 });
    View Code

    再比如,从数据库中查询出一组数据,接下来想得到他们的 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  });
    View Code

    在业务中遇到foreach循环处理,有时候我们就可以想想能不能像这样处理。

    2、array_map(callback $callback , $arr) 返回用户自定义函数作用后的数组。回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

    向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 />
    ";
        }
    
        echo "Before ...:
    ";
        //单数组
        array_walk($fruits, 'test_print');
    
        
    
        //带额外参数
        array_walk($fruits, 'test_alter', 'index');
        echo "... and after:
    ";
    
        array_walk($fruits, 'test_print');

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

  • 相关阅读:
    洛谷 P2634 BZOJ 2152 【模板】点分治(聪聪可可)
    洛谷 P3819 松江1843路
    洛谷 P1005 矩阵取数游戏
    洛谷 P2712 摄像头
    洛谷 P2774 方格取数问题
    洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
    洛谷 P2805 BZOJ 1565 植物大战僵尸
    洛谷 P2312 解方程
    洛谷 P3355 骑士共存问题
    洛谷 P2762 太空飞行计划问题
  • 原文地址:https://www.cnblogs.com/heyijing/p/4729774.html
Copyright © 2020-2023  润新知