【问题标题】:Grouping data using a value from a deep subarray使用深度子数组中的值对数据进行分组
【发布时间】:2019-12-11 15:57:54
【问题描述】:

如何使用多维数组第三级的列值分配第一级键?

我的意见:

$array = [
    [
        ["ID" => 2, "vendor_id" => "37", "order_id" => 776],
    ],
    [
        ["ID" => 2, "vendor_id" => "37", "order_id" => 786],
    ]
];

我目前的输出是这样的:

array(1) {
[787]=>
  array(2) {
    [0]=>
    array(40) {
      ["ID"]=>
      string(1) "1"
      ["vendor_id"]=>
      string(2) "37"
      ["order_id"]=>
      string(3) "776"
    }
    [1]=>
    array(40) {
      ["ID"]=>
      string(1) "2"
      ["vendor_id"]=>
      string(2) "37"
      ["order_id"]=>
      string(3) "787"
    }
  }
}

我想将 order_id 的值单独分组为一个键 - 最终结果如下所示:

array(1) {
  [776]=>
  array(2) {
    [0]=>
    array(40) {
      ["ID"]=>
      string(1) "2"
      ["vendor_id"]=>
      string(2) "37"
      ["order_id"]=>
      string(3) "776"
    }
  }
  [787]=>
  array(2) {
    [0]=>
    array(40) {
      ["ID"]=>
      string(1) "2"
      ["vendor_id"]=>
      string(2) "37"
      ["order_id"]=>
      string(3) "787"
    }
  }
}

【问题讨论】:

    标签: php arrays multidimensional-array grouping array-merge


    【解决方案1】:

    获取current 项或使用reset 并提取由order_id 索引的整个列:

    $result = array_column(current($array), null, 'order_id');
    

    如果可能有多个数组,那么只需循环和追加:

    $result = [];
    foreach($array as $v) {
        $result += array_column($v, null, 'order_id');
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用那个功能

      //$array is your input array
      //$mergedArray is the result wanted
      $mergedArray = array_reduce($array, function($acc, $val) {
          foreach ($val as $order) {
              $acc[$order['order_id']] = $order;    
          }
          return $acc;
      }, []);
      

      你可以试试http://sandbox.onlinephpfunctions.com/

      <?php
      $array = [
          787 => [
              0 => [ "ID" => 1, "vendor_id" => "37", "order_id" => 776],
              1 => [ "ID" => 2, "vendor_id" => "37", "order_id" => 787],
              2 => [ "ID" => 1, "vendor_id" => "37", "order_id" => 790],
          ],
          734 => [
              0 => [ "ID" => 1, "vendor_id" => "37", "order_id" => 722],
              1 => [ "ID" => 2, "vendor_id" => "37", "order_id" => 735],
              2 => [ "ID" => 1, "vendor_id" => "37", "order_id" => 734],
          ],
      
      ];
      
      
      $t = array_reduce($array, function($acc, $val) {
          foreach ($val as $order) {
              $acc[$order['order_id']] = $order;    
          }
      
          return $acc;
      }, []);
      
      var_dump($t);
      

      【讨论】:

        【解决方案3】:

        其他答案不保持描述为您想要的输出的多级结构。 order_id 值必须用作第一级键,并且第二级键必须在遇到时递增/索引。这将允许多个条目共享相同的第一级密钥。

        foreach() 内的 foreach(): (Demo)

        $result = [];
        foreach ($array as $group) {
            foreach ($group as $row) {
                $result[$row['order_id']][] = $row;
            }
        }
        var_export($result);
        

        array_reduce()foreach(): (Demo)

        var_export(
            array_reduce(
                $array,
                function ($carry, $group) {
                    foreach ($group as $row) {
                        $carry[$row['order_id']][] = $row;
                    }
                    return $carry;
                }
            )
        );
        

        【讨论】:

          猜你喜欢
          • 2011-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-26
          • 2021-10-28
          • 2017-12-15
          • 1970-01-01
          相关资源
          最近更新 更多