这是我的数据:
$dataItems = [
[
'id' => 1,
'serial' => "XXXXXXAA1",
'pd_item_info' =>
[
'id' => 1,
'quantity' => 5,
'ipo_item_pml_info' =>
[
'id' => 1,
'product_name' => 'Keyboard'
]
]
],
[
'id' => 2,
'serial' => "XXXXXXAA2",
'pd_item_info' =>
[
'id' => 2,
'quantity' => 10,
'ipo_item_pml_info' =>
[
'id' => 2,
'product_name' => 'Keyboard'
]
]
]
];
我需要这个输出:
$output = [
'product_name' => "Keyboard",
'serial' => ["XXXXXXAA1", "XXXXXXAA2"]
];
在 Laravel 中使用
foreach
和 array_push
,如何合并重复的 product_name
值并连接它们的 serial
值?
我假设
pd_item_info
和ipo_item_pml_info
总是在那里
首先根据产品名称区分数组密钥,所有序列密钥都附加在同一产品名称下
foreach($dataItems as $item) {
$products[$item['pd_item_info']['ipo_item_pml_info']['product_name']][] = $item['serial'];
}
//output
// [
// 'Keyboard' => ['XXXXXXAA1', 'XXXXXXAA2'];
// ]
接下来,根据您的需要进行格式化
foreach($products as $key => $product) {
$output[] = [
'product_name' => $key,
'serial' => $product
];
}
就是这样..=D
您可以使用数组解构语法仅访问所需的数据点,并通过无体循环填充结果数组。
因为您具有一对多关系,所以只需创建一个关联数组,其中键是产品名称,值是序列号的子数组。 演示
(我稍微扩展了您的输入数据。)
$result = [];
foreach (
$dataItems as [
'pd_item_info' => ['ipo_item_pml_info' => ['product_name' => $name]],
'serial' => $result[$name][]
]
);
var_export($result);
输出:
array (
'Keyboard' =>
array (
0 => 'XXXXXXAA1',
1 => 'XXXXXXAA2',
),
'Speaker' =>
array (
0 => 'XXXXXXFOO',
),
)
如果您想要问题正文中所要求的索引 3d 数组并希望使用 Laravel 的集合方法,那么就是这种方法。 PHPize 演示
var_export(
$dataItems
->groupBy(fn($item) => $item['pd_item_info']['ipo_item_pml_info']['product_name'])
->map(fn($group, $key) => [
'product_name' => $key,
'serial' => $group->pluck('serial')->toArray()
])
->values()
->toArray()
);
输出:
array (
0 =>
array (
'product_name' => 'Keyboard',
'serial' =>
array (
0 => 'XXXXXXAA1',
1 => 'XXXXXXAA2',
),
),
1 =>
array (
'product_name' => 'Speaker',
'serial' =>
array (
0 => 'XXXXXXFOO',
),
),
)