php数组遍历函数array_reduce、array_filter()、array_map()、array_walk()三者的用法和区别

array_reduce( arr , callablecallback )
使用回调函数迭代地将数组简化为单一的值。其中arr 为输入数组,callback(result ,value)接受两个参数,result为上一次迭代产生的值,value是当前迭代的值。

类似于laravel pluck的函数
$arr = array_reduce($prodcuts,function (&$arr,$v){
    $arr[$v['id']] = $v['title'];
    return $arr;
});

//数组求和
$a = [1,2,3];
$num = array_reduce($a, function($result,$value){
    return $result+$value;
})
echo $num;//6

//字符串拼接
$arr = [
    ['id'=>1,'name'=>"c"],
    ['id'=>2,'name'=>"b"],
    ['id'=>3,'name'=>"a"]
];
$str = array_reduce($arr, function($result, $value){
    return $result.",".$value['id'];
});
echo $str;//,1,2,3

array_filter(array callback [, int $flag = 0 ]])
  依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
array_filter会过滤掉任何值等于FALSE的值,也就是说 0值,空字符串,null,都会被过滤。

简言之:利用自定义函数对原数组进行筛选

示例1:
$newarr2 = array_filter($arr, function($value){
    if ($value%2 ==0) return false;
    return true;
});
var_dump($newarr2);die;
//输出结果
array(2) {
  ["a"]=>
  int(1)
  ["c"]=>
  int(3)
}

示例2:
$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() 函数的数组数目一致。

向array_map传入数组,出来的还是数组,而不是上面array_reduce()的一个值。
所以,array_map()最简单的就是把callback函数作用到每个数组的值上,最常见的场景就是 intval()、trim() 数组中的值.
简言之:有返回值,利用自定义函数对数组的每个元素进行修改

示例1:

//字符串转为整型
$arr = ['1','2','3'];
array_map('intval', $arr);

示例2:
$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()
  
函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。

注释:您可以通过把用户自定义函数中的第一个参数指定为引用:&$value,来改变数组元素的值

简言之:没有返回值。将自定义函数作用于每个数组元素,但不会影响数组。自定义函数的第一个参数传引用则会影响数组

示例1:
#array_walk 传引用,第三个参数传给回调函数
$arr = [1,2,3,4,5,6];
$a = 2;

//遍历数组arr,闭包函数的第三个参数可以额外传递一个变量
array_walk($arr, function(&$v, $k, $a){
   $v = $v + $a;
}, $a);
var_dump($arr);die;


示例2:
//将数组中的元素用于某种操作
$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_filter() 重点在于过滤(而不是新增)某个元素,当你处理到一个元素时,返回过滤后的数组
 array_map() 重点在于遍历一个数组或多个数组的元素,返回一个新的数组
 array_walk() 重点在于遍历数组进行某种操作, 对原数组进行操作

array_filter() 和 array_walk()对一个数组进行操作,数组参数在前,函数参数在后
 array_map() 可以处理多个数组,因此函数参数在前,数组参数在后,可以根据实际情况放入多个数组参数

array_filter()函数过滤空数组

array_filter()如果没有给出回调函数,所有的等于 FALSE 的元素将会被移除掉



$entry = array( 
             0 => 'hello world', 
             1 => false, 
             2 => 1, 
             3 => null, 
             4 => '', 
             5 => 'https://www.jb51.net', 
             6 => '0',
             7 => array(),
             8 => 0
          );
$validarr = array_filter($entry);
print_r($validarr);
//输出结果:
Array
(
    [0] => 'hello world'
    [2] => 1
    [5] => https://www.jb51.net
)

一些可以转化为布尔型FALSE的数组元素都被移除了,对我们想要得到一个有效的数组作了一个非常全面的过滤。

array_walk_recursive处理多维数组,函数的参数是键和值

1、取键值:

array_walk_recursive($contentArr, function ($value, $key) use (&$result) {
    array_push($result, $key);
});

2、取键值:

array_walk_recursive($contentArr, function ($value, $key) use (&$result) {
   array_push($result, $value);
});
原文地址:https://www.cnblogs.com/caibaotimes/p/14282519.html