【问题标题】:PHP reduce and merge? an array in several stepsPHP减少和合并?几个步骤的数组
【发布时间】:2021-10-03 23:49:35
【问题描述】:

我正在尝试减少/合并一个看起来像这样的数组

$test = Array
(
    [0] => Array
        (
            [id] => 150023
            [rowtext] => part 1
            [rowpartnumber] => 4360
            [qty] => 2.00
            [min_delper] => 2021-07-28
        )

    [1] => Array
        (
            [id] => 150026
            [rowtext] => part 2
            [rowpartnumber] => 4360
            [qty] => 2.00
            [min_delper] => 2021-07-29
        )

    [2] => Array
        (
            [id] => 150023
            [rowtext] => part 3
            [rowpartnumber] => 4361
            [qty] => 4.00
            [min_delper] => 2021-08-22
        )

    [3] => Array
        (
            [id] => 150023
            [rowtext] => part 4
            [rowpartnumber] => 4362
            [qty] => 2.00
            [min_delper] => 2021-09-22
        )

);

我想对 [rowpartnumber] 相同的 [qty] 求和,我可以用

$summa_test = array_reduce($test, function ($a, $b) {
  isset($a[$b['rowpartnumber']]) ? $a[$b['rowpartnumber']]['qty'] += $b['qty'] : $a[$b['rowpartnumber']] = $b;  
  return $a;
});

但我也想将 [rowpartnumer] 相同的 [id] 添加到 [id] 所以输出应该是这样的:

Array
(
    [0] => Array
        (
            [id] => 150023 150026
            [rowtext] => part 1
            [rowpartnumber] => 4360
            [qty] => 4.00
            [min_delper] => 2021-07-28
        )

    [1] => Array
        (
            [id] => 150023
            [rowtext] => part 3
            [rowpartnumber] => 4361
            [qty] => 4.00
            [min_delper] => 2021-08-22
        )

    [2] => Array
        (
            [id] => 150023
            [rowtext] => part 4
            [rowpartnumber] => 4362
            [qty] => 2.00
            [min_delper] => 2021-09-22
        )

);

我似乎无法理解它,所以请各位专家提供一点帮助,谢谢

【问题讨论】:

    标签: php arrays multidimensional-array sum reduce


    【解决方案1】:

    如果rowpartnumber 已经退出,您必须修改回调函数以将id 连接到前一个。像这样:

    $summa_test = array_reduce($test, function ($carry, $item) {
      if (isset($carry[$item['rowpartnumber']])) {
          $carry[$item['rowpartnumber']]['qty'] += $item['qty'];
          $carry[$item['rowpartnumber']]['id'] .= " ".$item['id'];
      }
      else {
          $carry[$item['rowpartnumber']] = $item;
      }
      return $carry;
    });
    

    我不知道这是否是一个问题,但由于连接id 将成为一个字符串,其中找到多个id - 但只有一个时仍然是整数。如果对您有问题,有两种选择:

    • 即使只有一个id也转换为字符串
    • 使用数组存储到多个 id。

    (我将参数名称更改为 PHP 文档中使用的名称 - 您可以将其更改回来,但通常保持这种方式是个好主意 - 其他人会更容易理解您的代码。)

    【讨论】:

    • 太棒了,这正是我想要的,关于 id 如果它对我来说是一个字符串就不会成为问题。并感谢您出色的教育解释
    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2021-12-20
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多