博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
巧用array_map()和array_reduce()替代foreach循环
阅读量:6609 次
发布时间:2019-06-24

本文共 2272 字,大约阅读时间需要 7 分钟。

hot3.png

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循环计算</p>
4 $sum += $v;// echo $sum5 }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循环处理,有时候我们就可以想想能不能像这样处理。

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循环。

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

 参考:

转载于:https://my.oschina.net/u/3477605/blog/3047536

你可能感兴趣的文章
redis命令 - GET
查看>>
httpd.conf的基本设置
查看>>
RHEL/Centos7新功能
查看>>
DBA日常工作职责
查看>>
Redis的持久化
查看>>
linux安装NFS服务器学习
查看>>
Planner .NET日历日程控件能给你的应用程序提供多种日历日程功能
查看>>
我的友情链接
查看>>
Linux压力测试
查看>>
JAVA中的线程机制(二)
查看>>
nginx安装与配置2(转载)
查看>>
Linux下Mongodb安装和启动配置
查看>>
2015 成长计划
查看>>
沈阳一饭店凌晨爆燃,燃气报警器时刻预防
查看>>
Redis 与 数据库处理数据的两种模式
查看>>
VUE2中axios的使用方法
查看>>
CS 229 notes Supervised Learning
查看>>
2018.10.27-dtoj-3996-Lesson5!(johnny)
查看>>
DataTable转换成json字符串
查看>>
ubuntu 12.04 安装 redis
查看>>