在写业务代码的时候,经常碰到需要处理一组数据的时候,通常的代码是这样的
//格式化$item[$key1]这个值,复杂点的情况可能需要经过两个函数func1和func2才能得到想要的结果
foreach ($arr as &$item){
$item = func1($item);
$item = func2($item);
}
//我们也可以用array_map()系统函数来处理
$arr = array_map(func1,$arr);
$arr = array_map(func2,$arr);
如果有另一组数组也要格式化,怎么办?
foreach ($arr2 as &$item){
$item = func1($item);
$item = func2($item);
}
//我们也可以用array_map()系统函数来处理
$arr2 = array_map(func1,$arr2);
$arr2 = array_map(func2,$arr2);
可以看到,我们重复写了一套代码.
为了以后避免出现这样的情况,我们可以写个统一处理的函数来处理
//格式化数据
function parseReturn(array $data = [], array $filters = [], $nested = true)
{
if (!$data) {
return [];
}
foreach ($filters as $filter) {
if ($nested) {
array_walk_recursive($data, $filter);
} else {
array_walk($data, $filter);
}
}
return $data;
}
//处理$arr
$funcs = ['func1','func2'];
$arr = parseReturn($arr,$funcs);
//理$arr2
$arr2 = parseReturn($arr2,$funcs);
//递归处理$arr3中的每个元素
$arr3 = parseReturn($arr3,$funcs,true);
接下来我们讨论另外一个经常碰到的问题,处理单一原数据格式化为我们想要的数据.
//处理data
$data = func1($data);
$data = func2($data);
$data = func3($data);
//处理data2
$data2 = func1($data2);
$data2 = func2($data2);
$data2 = func100($data2);
我们可以参考处理数组的方法做一些更改
//过滤函数
function argFilter($arg, array $filters = [])
{
if (!$arg) {
return false;
}
if (!$filters) {
$filters = [
'trim',
'strip_tags',
];
}
if (is_array($arg) && $arg) {
foreach ($arg as &$item) {
$item = funcHandler($filters, $item);
}
return $arg;
}
return funcHandler($filters, $arg);
}
//过滤器
function funcHandler($filters, $arg)
{
return array_reduce($filters, function ($carry, $item) {
if (is_callable($item)) {
return $item($carry);
}
return $carry;
}, $arg);
}
这里我们用了array_reduce这个迭代函数,将每次处理的结果当做下一次处理的参数.
//处理data
$funcs = ['func1','func2','func3'];
$data = argFilter($data,$funcs);
//处理data2
$funcs = ['func1','func2','func100'];
$data2= argFilter($data2,$funcs);
可能有人会问这样处理和之前的没多大区别啊?
区别就是我这样写觉得舒服:)