PHP实现多卖家商品按重量分别计算运费方案咨询
实现方案
1. 先封装运费计算函数
把你原有运费规则封装为可重复调用的函数,避免重复写判断逻辑:
/** * 根据商品重量计算对应运费 * @param int $weight 商品重量 单位:g * @return float|string 运费金额或不可配送提示 */ function calculateShipping(int $weight) { if($weight <= 500){ return 10; }else if($weight <= 1000){ return 15; }else if($weight <= 2000){ return 25; }else if($weight <= 3000){ return 35; }else if($weight <= 4000){ return 45; }else if($weight <= 5000){ return 55; }else if($weight <= 6000){ return 62.5; }else if($weight <= 7000){ return 70; }else if($weight <= 8000){ return 77.5; }else if($weight <= 9000){ return 95; }else if($weight <= 10000){ return 100; }else{ return 'Sorry We can\'t deliver over 10 KGs'; } }
2. 按卖家维度汇总购物车商品总重量
首先你需要从购物车数据中,按卖家为维度累加所有该卖家商品的总重量,示例代码如下:
// 模拟从数据库/购物车获取的用户购买商品列表,包含卖家、单商品重量、购买数量 $cartItems = [ ['seller' => 'Jacob', 'weight' => '500g', 'num' => 2], ['seller' => 'John', 'weight' => '3500g', 'num' => 1], ['seller' => 'Dani', 'weight' => '1500g', 'num' => 3], ]; $sellerTotal = []; foreach ($cartItems as $item) { $seller = $item['seller']; // 把重量字段的g去除,转为纯数字 $weight = intval($item['weight']); // 累加该卖家的总重量 if (!isset($sellerTotal[$seller])) { $sellerTotal[$seller] = 0; } $sellerTotal[$seller] += $weight * $item['num']; }
3. 逐卖家计算运费并累加总运费
遍历上一步得到的每个卖家总重量,单独计算运费后累加,同时保存明细用于前端展示:
$totalShipping = 0; $shippingDetail = []; $canDelivery = true; foreach ($sellerTotal as $seller => $totalWeight) { $shipping = calculateShipping($totalWeight); // 判断是否存在不可配送的情况 if (is_string($shipping)) { $canDelivery = false; $errorMsg = $seller . '店铺商品总重量超过10KG,' . $shipping; break; } $totalShipping += $shipping; $shippingDetail[] = [ 'seller' => $seller, 'total_weight' => $totalWeight . 'g', 'shipping' => $shipping . 'USD' ]; } if (!$canDelivery) { echo $errorMsg; // 这里可以加终止下单的逻辑 }
4. 展示运费明细给用户
你可以直接遍历$shippingDetail输出每个卖家的运费情况,示例输出:
foreach ($shippingDetail as $detail) { echo "卖家{$detail['seller']}:商品总重量{$detail['total_weight']},运费{$detail['shipping']}<br>"; } echo "总运费:{$totalShipping}USD";
验证你给出的示例场景的输出结果:
- 卖家Jacob:商品总重量1000g,运费15USD
- 卖家John:商品总重量3500g,运费45USD
- 卖家Dani:商品总重量4500g,运费55USD
- 总运费:115USD
和你直接按总重量计算的95USD的差异符合预期。
内容的提问来源于stack exchange,提问作者Anan
相关产品推荐
相关产品推荐

