优化CO₂费用计算代码:减少大量if分支的实现方案
优化大量IF分支的方案
问题背景
需要优化一段根据CO₂数值和燃料ID计算费用的代码,原代码包含大量IF分支。费用规则:
- CO₂数值低于131时,费用为0
- CO₂数值高于301时,按301对应的费用计算
- 不同燃料ID对应不同的费用梯度
优化思路
观察原代码的费用数值,发现每10个CO₂区间的费用是基础值的整数倍:131-140区间的费用是1倍,141-150是2倍,直到301及以上为18倍。基于这个规律,我们可以通过「倍数计算+燃料分组」的方式简化代码,彻底消除大量硬编码的IF分支。
优化代码示例
<?php $co2 = (int)$co2; // 从数据库获取CO₂数值,转为整数 $fuel_id = 8; // 从数据库获取燃料ID $priceText = ''; if ($co2 >= 131) { // 计算当前CO₂对应的倍数:131-140为1,141-150为2...301及以上为18 $baseOffset = max(0, $co2 - 130); $multiplier = min(ceil($baseOffset / 10), 18); // 定义燃料分组及对应基础单价 $fuelGroups = [ [ 'ids' => [2], // Diesel 'basePrice' => 40.47 ], [ 'ids' => [1, 5, 7, 8], // Petrol、Petrol/Hibrid等类型 'basePrice' => 20.24 ], [ 'ids' => [4, 8], // Petrol/Gas等类型 'basePrice' => 18.21 ] ]; // 匹配燃料ID,计算对应费用 foreach ($fuelGroups as $group) { if (in_array($fuel_id, $group['ids'])) { $currentPrice = number_format($group['basePrice'] * $multiplier, 2); $priceText .= $currentPrice . ' '; } } $priceText = trim($priceText); } // 输出结果 echo $co2 ? "Your co2 price is " . ($priceText ?: '0') . " $" : ''; ?>
方案优势
- 代码极简:彻底移除数十个IF分支,逻辑一目了然
- 维护成本低:新增燃料类型或调整基础单价时,只需修改
$fuelGroups数组 - 扩展性强:若后续CO₂区间规则调整,仅需修改倍数计算逻辑即可
替代方案:配置数组法(适合无规律价格)
如果后续费用规则不再有倍数规律,可以用配置数组存储所有区间的价格映射,直观且便于修改:
<?php $co2 = (int)$co2; $fuel_id = 8; $priceText = ''; // 定义各CO₂区间的价格配置 $priceConfig = [ 131 => [2 => '40.47', 1 => '20.24', 5 => '20.24', 7 => '20.24', 8 => '20.24', 4 => '18.21'], 141 => [2 => '80.94', 1 => '40.47', 5 => '40.47', 7 => '40.47', 8 => '40.47', 4 => '36.42'], // ... 补充中间区间的配置 301 => [2 => '728.46', 1 => '364.23', 5 => '364.23', 7 => '364.23', 8 => '364.23', 4 => '327.81'] ]; if ($co2 >= 131) { // 确定当前CO₂对应的区间 $targetKey = 301; foreach (array_keys($priceConfig) as $key) { if ($co2 >= $key && $co2 < $key + 10) { $targetKey = $key; break; } } // 获取对应价格,处理fuel_id=8的特殊情况(原逻辑输出两个价格) if (isset($priceConfig[$targetKey][$fuel_id])) { $priceText = $priceConfig[$targetKey][$fuel_id]; if ($fuel_id == 8) { $priceText .= ' ' . $priceConfig[$targetKey][4]; } } } echo $co2 ? "Your co2 price is " . ($priceText ?: '0') . " $" : ''; ?>
注意事项
原代码中fuel_id=8会同时触发两个IF分支,输出两个价格,若这是业务需求则保留,否则需调整分组逻辑避免重复输出。
内容的提问来源于stack exchange,提问作者Kuvalda
相关产品推荐
相关产品推荐

