格式化函数

在写业务代码的时候,经常碰到需要处理一组数据的时候,通常的代码是这样的

//格式化$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);

可能有人会问这样处理和之前的没多大区别啊?
区别就是我这样写觉得舒服:)

你可能感兴趣的:(格式化函数)