2016-05-06 44 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') 
)