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循环计算&lt;/p&gt;<br />
$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('name'=>a),
array('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);

虽然有时候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/51568629

巧用array_map()和array_reduce()替代foreach循环的更多相关文章

  1. PHP根据array_map、array_reduce和array_column获取二维数组中某个key的集合

    http://camnpr.com/php-python/1715.html 巧用array_map()和array_reduce()替代foreach循环

  2. C#中巧用妙法避免嵌套方式使用两个foreach循环

    问题:需要对DataGridViewRow的下拉框列Item2所选内容进行判断,看是否跟数据库里面某个配置表的数据列Item1匹配.如果用两个foreach循环进行匹配,会导致逻辑复杂而且容易只bre ...

  3. 关于java中for和foreach循环

    for循环中的循环条件中的变量只求一次值!具体看最后的图片 foreach语句是java5新增,在遍历数组.集合的时候,foreach拥有不错的性能. foreach是for语句的简化,但是forea ...

  4. JavaScript数组forEach循环

    JavaScript数组forEach循环 今天写JavaScript代码把forEach循环数组忘记写法了,在此记录一下以防止未来忘记. let a = [1, 2, 3]; a.forEach(f ...

  5. JAVA中的for-each循环与迭代

    在学习java中的collection时注意到,collection层次的根接口Collection实现了Iterable<T>接口(位于java.lang包中),实现这个接口允许对象成为 ...

  6. foreach循环 Java

    第一次遇到foreach循环,是在PHP的数组中,同样,在Java数组中,也遇到了foreach循环,都是用来遍历数组(集合).遍历数组,首先想到的一般都是用while,do while,for循环, ...

  7. 集合框架遍历方式之——for-each循环

    从Java5起,在Java中有了for-each循环,可以用来循环遍历collection和array.Foreach循环允许你在无需保持传统for循环中的索引,或在使用iterator /ListI ...

  8. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

  9. For-Each循环

    For-Each循环也叫增强型的for循环,或者叫foreach循环. For-Each循环是JDK5.0的新特性(其他新特性比如泛型.自动装箱等). For-Each循环的加入简化了集合的遍历. 语 ...

随机推荐

  1. java线程安全

    (一).java并发之原子性与可见性 原子性 原子是世界上的最小单位,具有不可分割性.比如 a=0:(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作.再比如:a+ ...

  2. C#-WinForm-Timer控件

    比如在窗体中显示时间: 错误思路一:我在窗体结构函数中写入一个死循环,每隔一秒显示一次当前时间 public Form6() { InitializeComponent(); while (true) ...

  3. dede使用方法----如何在wamp环境下安装dede

    dede是基本php编写的一套框架,因此在使用dede之前必须要先搭建一上php的环境.本篇文章首先讲述如何搭建一个wamp环境,再讲述如何安装dede. 准备工具:wamp , dedeCMS 1. ...

  4. js window.open 打开新窗体 参数设置

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. java.lang.Exception: No runnable methods

    java.lang.Exception: No runnable methods at org.junit.runners.BlockJUnit4ClassRunner.validateInstanc ...

  6. 源码安装Redis

    1.官网地址下载 猛击 mkdir /down cd down wgit http://download.redis.io/releases/redis-3.0.7.tar.gz ###准备工作:安装 ...

  7. Splay伸展树学习笔记

    Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...

  8. [cf621E]Wet Shark and Blocks

    Description 给定$n$个数和$b$个盒子,放一些数到盒子中,使得盒子不为空.每个盒子中的数是一样的,一个数可以被放到多个盒子中. 从每个盒子中取一个数,组成一个$b$位数,如果这个数$mo ...

  9. PHOG特征

    PHOG特征 2016年7月13日 21:07:57 什么是PHOG PHOG是Pyramid HOG(pyramid histogram of oriented gradient)的简称,是在图像尺 ...

  10. NAT功能的研究

    通俗的话:现在大部分的家用路由器都是这个功能,一个公网IP的拨号网络,然后地下全部电脑都可以用这个IP上网,进行数据转发,这就是NAT. 参考:http://baike.baidu.com/link? ...