一、array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值。php
其中$arr 为输入数组,$callback($result , $value)接受两个参数,$result为上一次迭代产生的值,$value是当前迭代的值。html
使用array_reduce()替代foreach()循环最经常使用的一个业务场景也许就是数组求和,好比:sql
1 $arr = array('1','2','3'); //计算数组中数字的和 2 $sum = 0; 3 foreach($arr as $v){ //使用 foreach循环计算</p><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循环处理,有时候咱们就能够想一想能不能像这样处理。数组
二、array_map(callback $callback , $arr) 返回用户自定义函数做用后的数组。回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。app
向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本身的正常的方式而已”。函数
//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/51568629ui