巧用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 });

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

虽然有时候foreach完全可以达到相同的效果,但是在代码中使用 array_map、array_reduce还有array_filter之类的函数,可以让代码更加的简洁,而不是一个php文件到处都是foreach循环。“这并非炫耀什么奇技淫巧,这只是PHP自己的正常的方式而已”。

时间: 2024-10-12 03:13:36

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

foreach循环语句

一.foreach循环语句介绍: 1.格式: for(类型 变量名称:被遍历数组或集合){ 其他操作(输出操作) } 2.作用: 主要是用于简化书写 二.foreach循环语句遍历数组: public class oneHundredAndEight_oneHundredAndNine { public static void main(String[] args) { String[] names = {"萌萌","纯纯","爱爱","

迭代器、foreach循环、泛型集合

集合的迭代 语法:Iterator<Object> it=集合.iterator(); while(it.hasNext()){ Object obj=it.next(); } is.hasNext(); //判断是否有下一个元素 it.next(); //移动指针,返回指针指向元素 注意:集合在遍历的过程中不能进行修改,如果进行了修改操作,那么就会抛出ConcurrentModificationException异常, 如果需要进行删除,使用迭代器的it.remove()方法 foreach

第46条:for-each循环优先于传统的for循环

for-each循环通过完全隐藏迭代器或者索引变量,避免混乱和出错的可能,适用于集合和数组和任何实现Iterable接口的对象. 使用传统for循环,容易出错: enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX } Collection<Face> faces = Arrays.asList(Face.values()); for(Iterator<Face> i = faces.iterator(); i.hasNext();) for(I

for foreach循环

//for循环 int[] nums = {1,2,3,4,5,6,8,7,9,10 }; for (int i = 0; i < nums.Length;i++ ) { Console.WriteLine(nums[i]); } Console.ReadKey(); //foreach循环 int[] nums = { 1, 2, 3, 4, 5, 6, 8, 7, 9, 10 }; foreach (var item in nums) { Console.WriteLine(item); }

For-Each循环

•For-Each循环的加入简化了集合的遍历 •其語法如下 –for(type element : array) { System.out.println(element).... } •参见程序 ForTest.java 当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息. 1 import java.util.ArrayList; 2 import java.util.Collection; 3 impo

JAVA中的for-each循环与迭代

在学习java中的collection时注意到,collection层次的根接口Collection实现了Iterable<T>接口(位于java.lang包中),实现这个接口允许对象成为 "foreach" 语句的目标,而此接口中的唯一方法,实现的就是返回一个在一组 T 类型的元素上进行迭代的迭代器. 一.迭代器Iterator 接口:Iterator<T> 1 public interface Iterator<E>{ 2 3 boolean h

JDK5新特性--forEach循环

1.增强for循环概述 简化数组和Collection集合的遍历 2.格式 for(元素数据类型 变量:数组或者Collection集合){     使用变量集合,该变量就是元素 } package cn; public class ForDemo { public static void main(String[] args) { int[] arr = {1,2,3,4,5}; for (int i = 0; i < arr.length; i++) { System.out.println

2.24 Java基础总结 ①for-each循环②继承概念③全类名④方法重写

①for-each循环②继承概念③全类名④方法重写 一.for-each循环依次遍历集合中每个元素的时候,for循环的一种int [] a = {1,2,3};for(int result : a){ System.out.println(result);} 全部依次遍历,但是没有细节的处理 二.继承is-a的关系子类继承来自父类中的所有属性和方法,呗继承的受访问修饰符限制但是构造不能被继承,父类的构造在构造是会起作用优点:①复用性②扩展父类属性和方法 Java是单继承,一个类只有一个父类单继承

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译. foreach (int x in myArray) { x++; //错误代码,因为改变了元素的值 Console.WriteLine(x); } 如果要让自定义的数据类型支持foreach循环,则该类型必须实现IEnumerable<T>接口,且存在对应此列表的IEnumerator<T>实现. 实际上,在.Net的底层(IL语言层面)而言, foreach (var