You need to enable JavaScript to run this app. PHP基于传入里程的阶梯递增计价算法优化问题
优惠活动
大模型
产品
解决方案
定价
更多

PHP基于传入里程的阶梯递增计价算法优化问题

里程计费的循环实现方案

先提个原代码里容易踩的维护坑:你现在代码里用来做判断的里程参数实际单位是米,不是公里,之前用$km当变量名很容易让后续接手的人搞错单位,这个是首先要调整的基础问题。

核心循环逻辑

完全绕开多层if分支判断,逻辑链路更顺,后续调整规则也更方便:

  • 直接把3.99美元设为初始总价,不需要单独对“里程≤3000”的场景写特殊分支
  • 从基础价覆盖的终点(3000米)开始,每次累加1000米的收费段,每跨过一个段就加0.5美元
  • 循环终止条件为:当前累计的收费里程点已经超过用户传入的实际里程值

具体实现代码

// 计费规则参数抽为常量,后续调整不用动核心逻辑
const BASE_PRICE = 3.99;
const BASE_DISTANCE = 3000;
const EXTRA_PRICE_PER_SEGMENT = 0.5;
const SEGMENT_LENGTH = 1000;

function calcTripPrice(int $distanceInMeter): float
{
    $totalPrice = BASE_PRICE;
    $currentChargedPoint = BASE_DISTANCE;
    // 循环计算超量段加价
    while ($currentChargedPoint < $distanceInMeter) {
        $currentChargedPoint += SEGMENT_LENGTH;
        $totalPrice += EXTRA_PRICE_PER_SEGMENT;
    }
    return round($totalPrice, 2);
}

规则匹配验证

拿你给出的计费示例逐一验证,结果和规则完全对得上:

  • 传入3000米:3000 < 3000 不成立,循环不执行,直接返回基础价3.99美元
  • 传入3400米:触发1次循环,返回3.99+0.5=4.49美元
  • 传入4000米:触发1次循环,返回4.49美元
  • 传入5000米:触发2次循环,返回3.99+0.5*2=4.99美元
  • 传入6001米:触发4次循环,返回3.99+0.5*4=5.99美元

这个实现的优势是所有计费规则都抽成了独立参数,后续如果要调整基础价、段长、加价金额,只要改最上面的常量值就行,不需要动核心计算逻辑,也不会出现嵌套if带来的边界判断漏算问题。


内容的提问来源于stack exchange,提问作者Ns789

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 17:06:07