按列对多维数组中的数据行进行分组,并合并另一列中的子数组

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

我正在尝试按一列值 (

order_id
) 对 3d 数组中的数据进行分组,并合并每组内
products
列中的子数组值。

样本数据:

$ordersGlobal = [
    [
        "order_id" => "65", 
        "products" => [
           [
              "description" => "Test6", 
              "brand" => "ACL", 
              "code" => "303127005576", 
              "OriginalPrice" => "328.0000"
           ] 
        ] 
    ], 
    [
        "order_id" => "66",  
        "products" => [
            [
            "description" => "Test5", 
            "brand" => "TEA", 
            "code" => "3900055", 
            "OriginalPrice" => "43.0000" 
            ] 
        ] 
    ], 
    [
        "order_id" => "66",
        "products" => [
            [
            "description" => "Te3st4", 
            "brand" => "TEA", 
            "code" => "3900056", 
            "OriginalPrice" => "43.0000"
            ] 
        ] 
    ]
] 

想要的结果:

[
    [
        "order_id" => "65", 
        "products" => [
           [
              "description" => "Test6", 
              "brand" => "ACL", 
              "code" => "303127005576", 
              "OriginalPrice" => "328.0000"
           ] 
        ] 
    ], 
    [
        "order_id" => "66",  
        "products" => [
            [
                "description" => "Test5", 
                "brand" => "TEA", 
                "code" => "3900055", 
                "OriginalPrice" => "43.0000" 
            ],
            [
                "description" => "Te3st4", 
                "brand" => "TEA", 
                "code" => "3900056", 
                "OriginalPrice" => "43.0000"
            ] 

        ] 
    ]
]

我的编码尝试:

$order_merge = array();
foreach ($ordersGlobal as $k => $data) {
    $orderId1 = $data['order_id'];
    $orderId2 = next($ordersGlobal)['order_id'] ?? false;
    if ($orderId1 == $orderId2) {
        $order_merge[$k]['order_id'] = $data['order_id'];
        $order_merge[$k]['products'] = array_merge(
            next($ordersGlobal)['products'],
            $data['products']
        );
    } else {
        $order_merge[$k]['order_id'] = $data['order_id'];
        // $order_merge[$k]['customerId'] = 1 $order_merge[$k]['products'] = $data['products'];
    }
} 
php arrays multidimensional-array grouping merging-data
2个回答
0
投票

我认为应该有效

$productsTemp = [];
$ordersMerge = [];

foreach ($ordersGlobal as $actualOrder)
{
    if (key_exists($actualOrder["order_id"], $productsTemp))
    {
        array_push($productsTemp[$actualOrder["order_id"]]["products"], $actualOrder["products"][0]);
    }
    else
    {
        $productsTemp[$actualOrder["order_id"]]["products"] = $actualOrder["products"];
    }
}

$ordersMerge[] = $productsTemp;

0
投票

这是一种简洁的方法,可将唯一引用推送到结果数组中,并将一个或多个

products
值添加到组的子数组中。

代码:(演示

$result = [];
foreach ($array as $row) {
    if (!isset($ref[$row['order_id']])) {
        $ref[$row['order_id']] = $row;
        $result[] = &$ref[$row['order_id']];
    } else {
        array_push($ref[$row['order_id']]['products'], ...$row['products']);
    }
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.