美文网首页
格式化函数

格式化函数

作者: pengtoxen | 来源:发表于2018-07-31 17:06 被阅读0次

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

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

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

    相关文章

      网友评论

          本文标题:格式化函数

          本文链接:https://www.haomeiwen.com/subject/ruehvftx.html