array_map 巧替 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);
另外,array_map 必包使用:
$orders=array_map(function($order)use($stockMap,$stockAmountMap, $users){
……
……
},$orders); $order 和 $orders 相当于 ;
foreach($orders as $order){}
use($stockMap,$stockAmountMap, $users) 必包,外部变量
虽然有时候foreach完全可以达到相同的效果,但是在代码中使用 array_map、array_reduce还有array_filter之类的函数,可以让代码更加的简洁,而不是一个php文件到处都是foreach循环。 “这并非炫耀什么奇技淫巧,这只是PHP自己的正常的方式而已” 。
转自:http://www.tuicool.com/articles/bmqeAv6
array_map 巧替 foreach的更多相关文章
- PHP之提升代码质量36计
转载:https://www.binarytides.com/35-techniques-to-enhance-your-php-code/ 1.不要使用相对路径 常常会看到: require_onc ...
- PHP多维数组转一维
目录 1. array_column函数 2. array_walk函数 3. array_map函数 4. foreach循环 5. array_map变种 参考:https://www.awaim ...
- 巧用array_map()和array_reduce()替代foreach循环
1.array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值. 其中$arr 为输入数组,$callback($result , $v ...
- 空循环比较 for foreach array_map array_walk
申请一个数组,然后不断的跑空循环,看看执行时间 for循环 foreach (不使用键) foreach(使用键) array_map array_walk 查看效率速度发现很明显 是foreach更 ...
- 巧记 In/hasOwnProperty/for…in/for…of/forEach区别
写在前面 上面提到的这些东西,反复的记忆,反复的忘记.现分享一种巧记方法,有需要,请参考,希望你也过目不忘. 仅提供巧记思路.仅提供巧记思路.仅提供巧记思路. 1. in 用于判断属性是否在对象上(包 ...
- C#中巧用妙法避免嵌套方式使用两个foreach循环
问题:需要对DataGridViewRow的下拉框列Item2所选内容进行判断,看是否跟数据库里面某个配置表的数据列Item1匹配.如果用两个foreach循环进行匹配,会导致逻辑复杂而且容易只bre ...
- PHP根据array_map、array_reduce和array_column获取二维数组中某个key的集合
http://camnpr.com/php-python/1715.html 巧用array_map()和array_reduce()替代foreach循环
- PHP数组函数: array_walk()与 array_map() 的区别
详细的介绍如下: PHP数组函数: array_walk() PHP数组函数: array_map() 实际应用中的一点区别与总结: array_walk() 主要用于对某个数组的迭代,相当于 for ...
- array_map与array_column之间的关系
/*|----------------------------------------------------------|array_map();将回调函数作用到给定数组的单元上|array_col ...
随机推荐
- Spring Boot项目属性配置
接着上面的入门教程,我们来学习下Spring Boot的项目属性配置. 1.配置项目内置属性 属性配置主要是在application.properties文件里配置的(编写时有自动提示)这里我们将se ...
- 在Java8的foreach()中不能break,如果需要continue时,可以使用return
今天使用lambda表达式处理集合时,发现对return.break以及continue的使用有点迷惑,于是自己动手测试了一下,才发现在使用foreach()处理集合时不能使用break和contin ...
- 分布式理论(六)—— Raft 算法
前言 我们之前讲述了 Paxos 一致性算法,虽然楼主尝试用最简单的算法来阐述,但仍然还是有点绕.楼主最初怀疑自己太笨,后来才直到,该算法的晦涩难懂不是只有我一个人这么认为,而是国际公认! 所以 Pa ...
- angularjs学习第三天笔记(过滤器第二篇---filter过滤器及其自定义过滤器)
您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ...
- MVC解决WebFrom的缺点
来自:http://www.cnblogs.com/xiaozhi_5638/p/4019065.html ASP.NET Webforms Behind Code的好处和存在的问题 ASP.NET ...
- <tbody>标签的用途
如果一个表格是 分 好几个部分 ,那么每个部分 使用一组<tbody>这样,下载完第一个部分 就可以先显示了,不用等后面的部分是否下载好,这是写给浏览器看的.
- 了解java虚拟机—CMS回收器(8)
CMS(Concurrent Mark Sweep)回收器 它使用的是标记清除算法,同时又是一个使用多线程并行回收的垃圾回收器. CMS主要工作步骤 CMS工作时主要步骤有初始标记.并发标记.预清理. ...
- zookeeper 知识点汇总
目录 Zookeeper 是什么 Zookeeper 树状模型 Zookeeper 集群结构 如何使用 ZooKeeper 运行 Zookeeper 步骤1 修改 ZooKeeper 配置文件 步骤 ...
- 漫画 | Java多线程与并发(一)
1.什么是线程? 2.线程和进程有什么区别? 3.如何在Java中实现线程? 4.Java关键字volatile与synchronized作用与区别? volatile修饰的变量不保留拷贝,直接访问主 ...
- Windows Server 2008R2常见的500错误
每次公司服务器装系统后再去部署服务,都会碰到这个问题,这里记录一下问题的解决方法 遇到“500 – 内部服务器错误. 您查找的资源存在问题,因而无法显示.”的问题. 解决办法: 1.解决方法:打开II ...