array_filter()、array_map()、array_walk()、array_reduce四者的用法和区别

array_filter()
  该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回结果数组中。数组键名保持不变。

$arr = ['a','b',1,2,3];

$new_arr = array_filter($arr,function($val){
    return is_numeric($val);
});

var_dump($new_arr);
//返回结果
//array (size=3)
//  2 => int 1
//  3 => int 2
//  4 => int 3



array_map()
  该函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
  可以传递多个数组,回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

$arr1 = [1,2,3,4,5];
$arr2 = [6,7,8,9,10];

//函数写前面,数组参数写后面
$new_arr = array_map(function($val1,$val2){
   return $val1 + $val2;
},$arr1,$arr2);

var_dump($new_arr);
//返回结果
//array (size=5)
//  0 => int 7
//  1 => int 9
//  2 => int 11
//  3 => int 13
//  4 => int 15



array_walk()
  对数组中的每个元素应用用户自定义函数


//将数组中的元素用于某种操作
$arr = ['a','b','c'];
array_walk($arr,function($val,$key){
    echo "{$key} is {$val} <br/>";
});
//返回结果
//0 is a
//1 is b
//2 is c

//改变数组中的值,传参的时候使用引用
array_walk($arr,function(&$val,$key){
    $val .= $val;
});
var_dump($arr);
//array (size=3)
//  0 => string 'aa' (length=2)
//  1 => string 'bb' (length=2)
//  2 => string 'cc' (length=2)


array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值。


其中arr为输入数组,arr 为输入数组,arr为输入数组,callback($result , value)接受两个参数,value)接受两个参数,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循环处理,有时候我们就可以想想能不能像这样处理
————————————————



异同点
 array_filter() 重点在于过滤(而不是新增)某个元素,当你处理到一个元素时,返回过滤后的数组
 array_map() 重点在于遍历一个数组或多个数组的元素,返回一个新的数组
 array_walk() 重点在于遍历数组进行某种操作
   array_filter() 和 array_walk()对一个数组进行操作,数组参数在前,函数参数在后

 array_map() 可以处理多个数组,因此函数参数在前,数组参数在后,可以根据实际情况放入多个数组参数

   array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值



分享至
2020-05-18 发布 ┊ 1441 人浏览 ┊ 0 人评论 ┊ 来源:原创 ┊ 收藏
返回顶部