Php 合并集合的Laravel数组,并添加新的属性

Php 合并集合的Laravel数组,并添加新的属性,php,arrays,laravel,collections,Php,Arrays,Laravel,Collections,我有一个“产品”集合数组,从下面的转储中可以看到 Illuminate\Support\Collection {#918 ▼ #items: array:12 [▼ 0 => App\Product {#934 ▶} 1 => App\Product {#943 ▶} 2 => App\Product {#959 ▶} 3 => App\Product {#968 ▶} 4 => App\Produ

我有一个“产品”集合数组,从下面的转储中可以看到

Illuminate\Support\Collection {#918 ▼
    #items: array:12 [▼
      0 => App\Product {#934 ▶}
      1 => App\Product {#943 ▶}
      2 => App\Product {#959 ▶}
      3 => App\Product {#968 ▶}
      4 => App\Product {#984 ▶}
      5 => App\Product {#993 ▶}
      6 => App\Product {#1009 ▶}
      7 => App\Product {#1018 ▶}
      8 => App\Product {#1034 ▶}
      9 => App\Product {#1043 ▶}
      10 => App\Product {#1059 ▶}
      11 => App\Product {#1068 ▶}
    ]
  }
这个阵列只有两个独特的产品

App\Product {#934 ▼
   ...
  +wasRecentlyCreated: false
  #attributes: array:10 [▼
    "id" => 1
    "slug" => "26027686555545"
    "details" => App\DispatchStock {#900 ▼
        ...
      #attributes: array:9 [▼
        ...
        "quantity" => 3
        "created_at" => "2020-05-04 15:56:07"
      ]
      ...
    }
  ]
...
}

每次复制6次(数量不同)。
我想循环遍历“Products”集合数组,合并所有重复项,然后返回一个仅包含唯一产品的数组。
并有如下内容:

Illuminate\Support\Collection {#918 ▼
    #items: array:2 [▼
      0 => App\Product {#934 ▶}
      1 => App\Product {#943 ▶}
    ]
  }
将新属性“组合可用数量”(产品所有“数量”的总和)附加到每个唯一产品的“详细信息”属性时。 例如,我希望最终产品的一个外观如下:

App\Product {#943 ▼
    ...
    +wasRecentlyCreated: false
    #attributes: array:10 [▼
      "id" => 2
      "slug" => "26027687444410"
      "details" => App\DispatchStock {#899 ▼
        ...
        #attributes: array:9 [▼
          ...
          "quantity" => 5
          "created_at" => "2020-05-04 15:56:07"
          "combined_available_quantity" => 27
        ]
        ...
      }
    ]
    ...
  }
我已经从下面的代码开始了

...
$combinedProducts = collect();
foreach ($products as $product) {

    $combinedProducts = $combinedProducts->each(function($combinedProduct) use ($combinedProducts, $product) {
                            if ($combinedProduct->slug == $product->slug) {
                                $qty = $product->details->quantity + $combinedProduct->details->quantity;
                                $combinedProduct->details->setAttribute('combined_available_quantity', $qty);
                            } else {
                                $product->details->setAttribute('combined_available_quantity', $product->details->quantity);
                                $combinedProducts->push($product);
                            }
                        });

    $combinedProducts = $combinedProducts->values();
}
但它有缺陷,不能给我要求的结果。

我需要一个更好的方法。谢谢。

那么为什么不修复该代码呢?如果不知道为什么会失败,就不可能提供help@NicoHaase,显然,由于我如何实现这些循环,我没有得到所需的结果。我知道这一点,但没有时间独自继续调试。因此,我要求采取“更好的方法”。谢谢拉米兹。在此之前,我还没有真正探讨过“groupBy”和“map”函数的使用。它们正是我所需要的。我编辑了您的答案,以显示我是如何解决问题的。
$collect->groupBy('slug')->map(function($item){
    return $item->sum('quantity');
})
$collect->groupBy('slug')->map(function($item){
    return $item->sum('quantity');
})