Fork me on GitHub

用array_map和array_reduce替代foreach循环


零落成泥碾作尘,只有香如故。

array_map

返回用户自定义函数作用后的数组
向array_map传入数组,出来的还是数组,而不是上面array_reduce()的一个值。所以,array_map()最简单的就是把 callback函数作用到每个数组的值上,最常见的场景就是 intval()、trim() 数组中的值,在一些框架的源码中也经常见到,比如:

1
2
3
$arr = array('2','3','4','5');
array_map('intval' , $arr);
array_map('htmlspecialchars' , $arr);

array_reduce

使用回调函数迭代地将数组简化为单一的值
使用array_reduce()替代foreach()循环最常用的一个业务场景也许就是数组求和,比如:

使用foreach

1
2
3
$arr = ['2','3','4','5'];
array_map('intval' , $arr);
array_map('htmlspecialchars' , $arr);

使用array_reduce

1
2
3
4
5
6
$nums = [1, 2, 3, 4, 6];
$sum = array_reduce($nums, function ($res, $num) {
return $res + $num;
});
dd($sum);

array_reduce带初始值

1
2
3
4
5
6
$arr = ['AAAA', 'BBBB', 'CCCC'];
$res = array_reduce($arr, function($carry, $item){
return $carry . $item;
}, '所有字符:');
dd($res);
// 所有字符:AAAABBBBCCCC

扩展array_filter

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function odd($var) {
return ($var % 2 == 1);
}
function even($var)
{
return ($var % 2 == 0);
}
$array1 = ["a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5];
$array2 = [6, 7, 8, 9, 10, 11, 12];
echo "Odd : ";
dump(array_filter($array1, "odd"));
echo "Even: ";
dump(array_filter($array2, "even"));

https://blog.tanteng.me/2015/07/array-map-reduce-foreach/