【问题标题】:PHP array_reduce with initial parameter as an arrayPHP array_reduce 初始参数为数组
【发布时间】:2016-09-01 17:33:12
【问题描述】:

我有这个初始数组:

[
    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 不能接收数组作为初始值吗?

【问题讨论】:

  • 你需要使用数组函数还是手动会好?
  • 我正在尽可能地发挥功能,我知道一个简单的 foreach 可以解决问题。
  • 根本不是 array_reduced 应该做的:$newArray = array_column($oldArray, 'value', 'id'); array_walk($newArray, function(&$value) { $value = ['value' => $value]; });Demo
  • 哦,那行得通。如果您发布答案,我将很乐意接受它

标签: php arrays dictionary reduce


【解决方案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 的方法时遇到了这个问题,所以我觉得我应该写这个评论。我希望这将有助于未来的读者。 :)

【讨论】:

  • 我认为这应该是公认的答案。我在做 return $list[$client->ID] = $client->post_title;如果我只是把它放在自己的行上并返回它工作的列表,它不会产生正确的数组。
  • @ChristopherKarlsson 谢谢!我很高兴这对您的问题有所帮助:) 但是,我会让作者决定这是否会成为公认的答案。我想他已经做到了,但永远不会太晚。问候,亚历山大
【解决方案2】:

正如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
        )

)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我知道,我知道,只是我想尽可能地实用。不过还是谢谢!
    • 我完全明白。我认为使用 array_map 或 array_walk 的问题在于,您在转换键/索引(即从 0 到 5)时会遇到问题。至少这样,您需要的结果代码很少。
    【解决方案4】:

    您可以在功能上做到这一点。不过,我怀疑它实际上并没有更具可读性。

    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')
    )
    

    【讨论】:

      【解决方案5】:
      array_reduce($ar, function ($acc, $item) {
              $acc[$item['id']] = [ 'value' => $item['value']]; 
              return $acc;
          }, [])
      

      【讨论】:

      • 虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。
      猜你喜欢
      • 2015-05-26
      • 2010-12-07
      • 2012-06-03
      • 2015-08-14
      • 2015-07-14
      • 2016-03-26
      • 2018-12-30
      • 1970-01-01
      • 2021-12-07
      相关资源
      最近更新 更多