格式化函數(shù)

在寫業(yè)務(wù)代碼的時(shí)候,經(jīng)常碰到需要處理一組數(shù)據(jù)的時(shí)候,通常的代碼是這樣的

//格式化$item[$key1]這個(gè)值,復(fù)雜點(diǎn)的情況可能需要經(jīng)過兩個(gè)函數(shù)func1和func2才能得到想要的結(jié)果
foreach ($arr as &$item){
  $item = func1($item);
  $item = func2($item);
}

//我們也可以用array_map()系統(tǒng)函數(shù)來處理
$arr = array_map(func1,$arr);
$arr = array_map(func2,$arr);

如果有另一組數(shù)組也要格式化,怎么辦?

foreach ($arr2 as &$item){
  $item = func1($item);
  $item = func2($item);
}

//我們也可以用array_map()系統(tǒng)函數(shù)來處理
$arr2 = array_map(func1,$arr2);
$arr2 = array_map(func2,$arr2);

可以看到,我們重復(fù)寫了一套代碼.
為了以后避免出現(xiàn)這樣的情況,我們可以寫個(gè)統(tǒng)一處理的函數(shù)來處理

//格式化數(shù)據(jù)
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中的每個(gè)元素
$arr3 = parseReturn($arr3,$funcs,true);

接下來我們討論另外一個(gè)經(jīng)常碰到的問題,處理單一原數(shù)據(jù)格式化為我們想要的數(shù)據(jù).

//處理data
$data = func1($data);
$data = func2($data);
$data = func3($data);

//處理data2
$data2 = func1($data2);
$data2 = func2($data2);
$data2 = func100($data2);

我們可以參考處理數(shù)組的方法做一些更改

    //過濾函數(shù)
    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這個(gè)迭代函數(shù),將每次處理的結(jié)果當(dāng)做下一次處理的參數(shù).

//處理data
$funcs = ['func1','func2','func3'];
$data = argFilter($data,$funcs);

//處理data2
$funcs = ['func1','func2','func100'];
$data2= argFilter($data2,$funcs);

可能有人會問這樣處理和之前的沒多大區(qū)別啊?
區(qū)別就是我這樣寫覺得舒服:)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容