使用深度子数组中的值对数据进行分组
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;
}
)
);
如何使用多维数组第三层的列值分配第一层键?
我的输入:
$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;
}
)
);