Laravel中按供应商ID维度累加多维数组quantity值的实现方案
按供应商ID维度累加多维数组中quantity值的解决方案
针对你遇到的问题——已经有按供应商ID分组的多维数组,但无法按维度拆分统计quantity总和,这里有几个简单有效的方案:
方案1:原生PHP数组遍历计算
因为你的$quantities数组已经按供应商ID作为键进行了分组,直接遍历每个供应商组累加即可:
$supplierQuantityTotals = []; foreach ($quantities as $supplierId => $productList) { $totalQty = 0; foreach ($productList as $product) { $totalQty += $product['quantity']; } $supplierQuantityTotals[$supplierId] = $totalQty; } // 最终结果:[1 => 3, 2 => 1]
方案2:Laravel Collection 正确分组求和
你之前用Collection得到总数量4,应该是直接对整个集合调用了sum('quantity'),没有按供应商分组后再统计。可以利用已有的分组结构,或者重新从原始数据处理:
方式A:基于现有$quantities数组处理
$supplierQuantityTotals = collect($quantities) ->map(function ($productList) { // 对每个供应商的产品列表求和 return collect($productList)->sum('quantity'); }) ->toArray();
方式B:直接从$basket->products处理(更简洁)
如果不需要保留原$quantities数组的结构,直接从原始产品集合分组求和会更高效:
$supplierQuantityTotals = collect($basket->products) ->groupBy('supplier_id') ->map(function ($products) { return $products->sum('quantity'); }) ->toArray();
方案3:生成数组时同步计算总和
在你生成$quantities数组的循环里,顺便累加每个供应商的quantity,一步到位避免二次遍历:
$quantities = array(); $supplierTotals = array(); // 新增数组存储每个供应商的总数量 $count = 0; foreach ($basket->products as $product) { $supplier = Supplier::find($product->supplier_id); if($supplier->shipping_cost == 0) { $shipping_cost = $delivery_amount; } else { $shipping_cost = $supplier->shipping_cost; } $quantities[$supplier->id][] = array ( 'supplier_id' => $supplier->id, 'child_product_id' => $product->child_product_id, 'quantity' => $product->quantity, 'shipping_cost' => $shipping_cost, ); // 同步累加总数量 if (!isset($supplierTotals[$supplier->id])) { $supplierTotals[$supplier->id] = 0; } $supplierTotals[$supplier->id] += $product->quantity; } // $supplierTotals 就是你需要的结果:[1 => 3, 2 => 1]
以上几种方案都能实现按供应商ID维度拆分统计quantity总和,你可以根据自己的代码场景选择最合适的方式。
内容的提问来源于stack exchange,提问作者StuBlackett
相关产品推荐
相关产品推荐

