首页 > 解决方案 > Laravel 5.5 集合部分分组

问题描述

我需要有关如何按位置然后按大小对以下集合进行分组的帮助:

[
    {
        "location_id": 1,
        "location_address": "Some address",
        "location_image": "https://some/image.url",
        "size_id": 1,
        "size_code": "S",
        "available_boxes": 3
    },
    {
        "location_id": 1,
        "location_address": "Some address",
        "location_image": "https://some/image.url",
        "size_id": 2,
        "size_code": "M",
        "available_boxes": 4
    },
    {
        "location_id": 1,
        "location_address": "Some address",
        "location_image": "https://some/image.url",
        "size_id": 3,
        "size_code": "L",
        "available_boxes": 5
    },
    {
        "location_id": 2,
        "location_address": "Some other address",
        "location_image": "https://some/other/image.url",
        "size_id": 4,
        "size_code": "XL",
        "available_boxes": 10
    }
]

这是预期的结果:

预期结果

真的很感激,提前谢谢!

标签: phpcollectionslaravel-5.5

解决方案


可能不优雅,但这可以完成工作:

$locations = $this->records->unique('location_id');
$transformed = [];

foreach ($locations as $location) {
    $sizes = $this->records->whereStrict('location_id', $location->location_id);
    $transformedSizes = [];

    foreach ($sizes as $size) {
        $transformedSizes[] = [
            'id' => $size->size_id,
            'code' => $size->size_code,
            'available_boxes' => $size->available_boxes
        ];
    };

    $transformed[] = array_merge(
        [
            'id' => $location->location_id,
            'address' => $location->location_address,
            'image' => $location->location_image
        ],
        [
            'sizes' => $transformedSizes
        ]
    );
}

return $transformed;

推荐阅读