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
相关产品推荐
相关产品推荐

