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');
})