php数组遍历函数array_filter()、array_map()、array_walk()、array_reduce三者的用法和区别
array_filter() 重点在于过滤(而不是新增)某个元素,当你处理到一个元素时,返回过滤后的数组
array_map() 重点在于遍历一个数组或多个数组的元素,返回一个新的数组
array_walk() 重点在于遍历数组进行某种操作array_filter() 和 array_walk()对一个数组进行操作,数组参数在前,函数参数在后
array_map() 可以处理多个数组,因此函数参数在前,数组参数在后,可以根据实际情况放入多个数组参数
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);
});