PHP array_reduce,初始参数为数组

时间:2016-05-06 15:12:52

标签: php arrays dictionary 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无法接收数组作为初始值吗?

5 个答案:

答案 0 :(得分:1)

有时最好的解决方案是最简单的。循环遍历数组并将id和value分配给新数组。

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

答案 1 :(得分: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
        )

)

答案 2 :(得分:1)

您的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的方法时遇到了这个问题,所以我觉得我应该写这篇评论。希望这对以后的读者有所帮助。 :)

答案 3 :(得分: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')
)

答案 4 :(得分:0)

String getBan = "SELECT * FROM bans";
PreparedStatement insert = SQLConnection.getConnection().prepareStatement(getBan);

        embed.addField("Punishment Type", "Ban", true);
        embed.addField("ID", insert.executeQuery().getString("id"), true);
        embed.addField("UUID", insert.executeQuery().getString("uuid"), false);
        embed.addField("Banned By", insert.executeQuery().getString("banned_by_name"), true);
        embed.addField("Reason", insert.executeQuery().getString("reason"), true