2017-08-15 72 views
0

我有下一個陣列無臨時變量格式化陣列

[ 
    ['id' => 30, 'count' => 3], 
    ['id' => 45, 'count' => 7] 
] 

我需要它是

[ 
    30 => ['count' => 3], 
    45 => ['count' => 7] 
] 

我做什麼

$formatted = []; 
foreach ($services as $service) { 
    $formatted[$service['id']] = [ 
     'count' => $service['count'] 
    ]; 
} 

我想是一個比較沒有臨時的$格式變量的優雅解決方案。謝謝!

更新。非常感謝@rtrigoso! 隨着laravel收藏,我的代碼看起來未來

$services->reduce(function ($carry, $item) { 
     $carry[$item['id']] = ['count' => $item['count']]; 
     return $carry; 
    }); 
+3

但爲什麼呢?如果您不使用第三個變量並直接更新主數組...您可能會覆蓋索引。例如,如果您有一個ID爲30,但也有一個在索引30的項目,它會覆蓋它,當你設置ID。 –

+0

只是覺得應該有一個更優雅和正確的方式來做到這一點。就像$ formatted = array_magic($ array,'id') – cleverketchup

回答

2

您可以使用array_reduce

$x_arr = array(
    array('id' => 30, 'count' => 3), 
    array('id' => 45, 'count' => 7), 
); 

$y_arr = array_reduce($x_arr, function ($result, $item) { 
    $result[$item['id']] = array('count' => $item['count']); 
    return $result; 
}, array()); 

print_r($y_arr); 

它會給你你想要的結果:

Array 
(
    [30] => Array 
    (
     [count] => 3 
    ) 

    [45] => Array 
    (
     [count] => 7 
    ) 
) 
5

你可以用array_column做到這一點的一條線:

$array = array_column($array, null, 'id'); 

所需輸出之間的一個區別是,這仍然將包含id關鍵在陣列中,像這樣的第二級:

[ 
    30 => ['id' => 30, 'count' => 3], 
    45 => ['id' => 45, 'count' => 7], 
] 

但希望不會引起任何問題。如果您需要將其刪除,你可以像做:

$array = array_map(function ($e) { 
    unset($e['id']); 
    return $e; 
}, $array); 

這種做法可能是最好的,如果你的行可能在他們在未來有更多的密鑰,即它是更快地列出的密鑰刪除而不是保留的密鑰。如果沒有,你只會有一個計數,那麼說實話,你最初的例子可能是你得到的最好的例子。

+0

在我看來這很好,我看不出爲什麼需要第二層數組。 [30] =>「3」'有什麼問題? – Andreas

+0

但我需要擺脫'id'鍵。這是抓住。 – cleverketchup

+1

@cleverketchup看我的編輯 – iainn