在寫業(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ū)別就是我這樣寫覺得舒服:)