2016-05-06 47 views
2

我有這樣的初始陣列:PHP array_reduce與初始參數爲數組

[ 
    0 => ['id' => 5, 'value' => 50], 
    1 => ['id' => 6, 'value' => 60], 
    2 => ['id' => 7, 'value' => 70], 
] 

,並希望將其轉換爲:

[ 
    5 => ['value' => 50], 
    6 => ['value' => 60], 
    7 => ['value' => 70], 
] 

起初,我試圖用map,卻能不會修改數組鍵,所以我認爲reduce可以解決問題,因爲它將將數組減少爲單個值,在這種情況下爲數組。所以我嘗試過:

array_reduce(
    $array, 
    function($carry, $item) { 
     return $carry[$item['id']] = $item['value']; 
    }, 
    [] 
); 

但是它返回這個錯誤Cannot use a scalar value as an array。我究竟做錯了什麼? array_reduce不能接收數組作爲初始值嗎?

+0

你需要使用陣列功能或手動將是好? –

+0

我試圖儘可能地做到這一點,我知道一個簡單的foreach將解決這個問題。 – Mathius17

+3

不是真正的array_reduced應該做什麼:'$ newArray = array_column($ oldArray,'value','id'); array_walk($ newArray,function(&$ value){$ value = ['value'=> $ value];});'[Demo](https://3v4l.org/nWdfg) –

回答

1

由於Mark Baker做到了。我也做了foreach循環。

$arr = array(
      array('id' => 5, 'value' => 50), 
      array('id' => 6, 'value' => 60), 
      array('id' => 7, 'value' => 70) 
     ); 

$result = array(); 
$result = array_column($arr, 'value', 'id'); 
array_walk($result, function(&$value) { $value = ['value' => $value]; }); 


//I did this using foreach loop, But the OP need it through array function. 
//foreach($arr as $key => $value){ 
// $result[$value['id']] = array('value' => $value['value']); 
//} 

echo '<pre>'; 
print_r($result); 

結果:

Array 
(
    [5] => Array 
     (
      [value] => 50 
     ) 

    [6] => Array 
     (
      [value] => 60 
     ) 

    [7] => Array 
     (
      [value] => 70 
     ) 

) 
1

有時最好的解決方案是最簡單的。循環訪問數組,並將id和值分配給新數組。

$new_array = array();  
foreach ($array as $key => $arr) { 
    $new_array[$arr['id']] = array('value' => $arr['value']); 
} 
+1

我知道,我知道,只是我想盡可能地做到這一點。不過謝謝! – Mathius17

+0

我完全明白這一點。我認爲這個問題是使用array_map或array_walk的問題,你會遇到一個轉換鍵/索引的問題,即從0到5.至少這種方式對於你所需要的結果來說只是很少的代碼。 – rharvey

0

你可以做到這一點功能。然而,我懷疑它實際上不是更具可讀性。

array_combine(
    array_column($a, 'id'), 
    array_map(function($v) { return ['value' => $v['value']]; }, $a) 
); 

甚至......

array_map(
    function($v) { return ['value' => $v['value']]; }, 
    array_column($a, null, 'id') 
)