Laravel 中的多维数组中的数据按深列值进行分组,并累积另一列中的值

问题描述 投票:0回答:2

这是我的数据:

$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
值?

php arrays laravel multidimensional-array grouping
2个回答
1
投票

我假设

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


0
投票

您可以使用数组解构语法仅访问所需的数据点,并通过无体循环填充结果数组。

因为您具有一对多关系,所以只需创建一个关联数组,其中键是产品名称,值是序列号的子数组。 演示

(我稍微扩展了您的输入数据。)

$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',
    ),
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.