前言:我自己用此类回调函数,来替代 foreach 纯粹是用为代码的简洁性,让代码更好看。(我有点代码小洁癖~)
1、array_reduce
当迭代处理一个一维索引数组时,在回调函数内是无法获取到当时元素索引的。所以想要获取时,需得借助一个外部变量。
目的:把 $arr 遍历到 标签内(就是拼接option字符串)
$arr = [
0 => '全部',
1 => 'a',
2 => 'b',
3 => 'c',
];
解决:
$index = 0;
$options = array_reduce($data, function($carry, $item) use (&$index){
## $index则为当前两个元素 $item 的索引
return $carry . '' . $item . '';
}, '');
var_dump($options);
输出为
全部abc
2、array_map(callable $callback , array $array1 [, array $... ] )
很多情况下,迭代的数据一般为一个 二维关联数组,但 array_map 本身在回调函数的函数体内无法获取到 关联数组的下标 的。
目的:在回调体内获取迭代关联数组的下标值。
解决:可以把关联数组的下标通过 array_map()的第三个形参把下标传进去。
$arr = [
'a' => 1,
'b' => 2,
'c' => 3
];
$res = array_map(function($item, $key){
echo '$arr[' . $key . ']=' . $item . '
';
}, $arr, array_keys($arr));
输出结果为
$arr[a]=1
$arr[b]=2
$arr[c]=3
题外话,有个典型的应用,也可以这样用。打个比方,如入库商品。
## 接受商品的基本信息与规格信息
$arr = $_GET;
print_r($arr);
/*
Array
(
[goods] => 辣条
[spec] => Array
(
['attr'] => Array
(
[0] => 颜色
[1] => 口感
[2] => 副作用
)
['value'] => Array
(
[0] => 红色
[1] => 辣
[2] => The `菊花` is hot
)
)
)
*/
## 处理规格信息,使其可以批量添加
$arr['spec'] = array_map(function($item, $key){
return [
'attr' => $key,
'value' => $item,
];
}, $arr['spec']['value'], $arr['spec']['attr']);
print_r($arr);
/*
Array
(
[goods] => 辣条
[spec] => Array
(
[0] => Array
(
[attr] => 颜色
[value] => 红色
)
[1] => Array
(
[attr] => 口感
[value] => 辣
)
[2] => Array
(
[attr] => 副作用
[value] => The `菊花` is hot
)
)
)
*/
# 这样处理好数组就特别方便,数组中 `商品的规格` 的就可以批量添加了
参考资料:
laravel框架代码 - 集合 的封装 -> 传送门