PHP array_reduce 初始参数为数组
PHP array_reduce with initial parameter as an array
我有这个初始数组:
[
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'];
},
[]
);
但是它returns这个错误Cannot use a scalar value as an array
。我究竟做错了什么? array_reduce
是否不能接收数组作为初始值?
有时最好的解决方案是最简单的。遍历数组并将 id 和值分配给新数组。
$new_array = array();
foreach ($array as $key => $arr) {
$new_array[$arr['id']] = array('value' => $arr['value']);
}
正如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
)
)
你可以在功能上做到这一点。但是我怀疑它实际上并没有更具可读性。
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')
)
array_reduce($ar, function ($acc, $item) {
$acc[$item['id']] = [ 'value' => $item['value']];
return $acc;
}, [])
你的 array_reduce
没有工作,因为你没有从回调函数返回累加器数组(carry
在你的情况下)。
array_reduce(
$array,
function($carry, $item) {
$carry[$item['id']] = $item['value'];
return $carry; // this is the only line I added :)
},
[]
);
我在寻找使用方法 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'];
},
[]
);
但是它returns这个错误Cannot use a scalar value as an array
。我究竟做错了什么? array_reduce
是否不能接收数组作为初始值?
有时最好的解决方案是最简单的。遍历数组并将 id 和值分配给新数组。
$new_array = array();
foreach ($array as $key => $arr) {
$new_array[$arr['id']] = array('value' => $arr['value']);
}
正如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
)
)
你可以在功能上做到这一点。但是我怀疑它实际上并没有更具可读性。
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')
)
array_reduce($ar, function ($acc, $item) {
$acc[$item['id']] = [ 'value' => $item['value']];
return $acc;
}, [])
你的 array_reduce
没有工作,因为你没有从回调函数返回累加器数组(carry
在你的情况下)。
array_reduce(
$array,
function($carry, $item) {
$carry[$item['id']] = $item['value'];
return $carry; // this is the only line I added :)
},
[]
);
我在寻找使用方法 array_reduce
时遇到了这个问题,所以我觉得我应该写这篇评论。我希望这对未来的读者有所帮助。 :)