2017-09-08 23 views
0

在我的日常工作中,作爲一名php開發人員,我發現自己在這裏再次處理數組&。php>數組處理:良好的面向對象的庫?

考慮:

$array1; // array to process 
$keysToKeep   = ['k1', 'k2', 'k3']; 
$keysToTranslate = ['k1' => 'hello1']; 
$keysToLower  = ['k2', 'k3']; 

過程的典型例子是:

$arrayProcessed = []; 
foreach ($array1 as $k => $v) { 
    if (array_key_exists($k, $keysToKeep) { 
     $arrayProcessed[$k] = $v; 
    } 
    if (isset($keysToTranslate[$k])) { 
     $arrayProcessed[$keysToTranslate[$k]] = $v; 
     unset($arrayProcessed[$k]); 
    } 
} 
foreach ($keysToLower AS $k) { 
    if ($array_key_exists($k, $arrayProcessed)) { 
     $arrayProcessed[$k] = strtolower($array1[$k]); 
    } 
} 

我夢想的API,讓我來代替寫的:

$arrayProcessed = owArray::getInstance($array1) 
->keepKeys($keysToKeep) 
->renameKeys($keysToTranslate) 
->map($keysToLower, 'strtolower') 
; 

任何人都可以點我到一個朝着那個方向走的圖書館?

THX提前任何提示;-)

+0

我無法想象它會太難以製作一個功能或類爲您做到這一點 – GrumpyCrouton

回答

0

Laravel有很大Collections。使用他們你正在嘗試做的,可以這樣寫:

$array = [ 
    'k1' => 'Foo', 
    'k2' => 'Bar', 
    'k3' => 'Baz', 
    'k4' => 'quux', 
    'k5' => 'quuuux' 
]; 

$keysToKeep   = ['k1', 'k2', 'k3']; 
$keysToTranslate = ['k1' => 'Hello1']; 
$keysToLower  = ['k2', 'k3']; 

$result = collect($array) 
    ->only($keysToKeep) 
    ->merge($keysToTranslate) 
    ->pipe(function ($array) use ($keysToLower) { 
     return $array->merge(
      $array->only($keysToLower)->map(function ($value) { 
       return strtolower($value); 
      }) 
     ); 
    }) 
    ->toArray(); 

結果將是:

array(3) { 
    ["k1"]=> 
    string(6) "Hello1" 
    ["k2"]=> 
    string(3) "bar" 
    ["k3"]=> 
    string(3) "baz" 
} 

而且我幾乎可以肯定(關於$keysToLower)的最後一部分可以寫更短。

有一本書和一門課"Refactoring to Collections"Adam Wathan。儘管他們不是免費的,但值得一試。

+0

Thx Sevavietl。有趣的api。令人驚訝的實例:既不是「新」,也不是靜態調用。我猜這個函數返回一個對象... – ffrey

+1

@ffrey,是的,它只是一個包裝,它返回一個'Illuminate \ Support \ Collection'的實例。 – sevavietl