You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:54:02