使用深度子数组中的值对数据进行分组

Grouping data using a value from a deep subarray

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

我的输入:

$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"
    }
  }
}

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

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

如果可以有多个数组,则循环并追加:

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

你可以使用那个功能

//$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);

其他答案没有保持描述为所需输出的多级结构。 order_id 值必须用作一级键,二级键必须是遇到的 incremented/indexed。这将允许多个条目共享相同的第一级密钥。

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;
        }
    )
);