Групповой массив php - PullRequest
       17

Групповой массив php

0 голосов
/ 21 апреля 2020

У меня есть следующий массив, и мне нужна группа type_id

array:11 [▼
  0 => {
    +"product_id": 521
    +"product_name": "Name product 1"
    +"type_id": 1
  }
  1 => {
    +"product_id": 521
    +"product_name": "Name product 1"
    +"type_id": 2
  }
  2 => {
    +"product_id": 521
    +"product_name": "Name product 1"
    +"type_id": 3
  }
  3 => {
    +"product_id": 526
    +"product_name": "Name product 2"
    +"type_id: 1
  }
  4 => {
    +"product_id": 526
    +"product_name": "Name product 2"
    +"type_id": 2
  }
]

Я хочу сгруппировать type_id в массив следующим образом:

array:2 [▼
  0 => {
    +"product_id": 521
    +"product_name": "Name product 1"
    +"type_id" : {
        0 => 1
        1 => 2
        2 => 3
    }
  }
  1 => {
    +"product_id": 526
    +"product_name": "Name product 2"
    +"type_id": {
        0 => 1
        1 => 2
    }
  }
]

Я пытался, но не смог группа type_id. Любая помощь высоко ценится! Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Измените массив на collection, чтобы вы могли использовать метод сбора, такой как groupBy , map , pluck , values ​​

collect($array)->groupBy('product_id')->map(function($products) {
    $obj = clone $products->first();
    $obj->type_id = $products->pluck('type_id');
    return $obj;
})->values()->all();
0 голосов
/ 21 апреля 2020

Здесь решение, где $ arr - ваш входной массив, а $ arrCollapsed выходной массив

$arrCollapsed = [];
foreach ($arr as $product) {
    if (false == isset($arrCollapsed[$product["product_id"]])) {
        $arrCollapsed[ $product["product_id"] ] = $product;
        $arrCollapsed[$product["product_id"]]["type_id"] = [ $product["type_id"] ];
    }
    elseif (false == in_array($product["product_id"]["type_id"], $arrCollapsed[$product["type_id"]])) {
        $arrCollapsed[$product["product_id"]]["type_id"][] = $product["type_id"];
    }
}
...