【问题标题】:How to make this code more clear and flexible?如何让这段代码更加清晰和灵活?
【发布时间】:2021-07-23 17:18:18
【问题描述】:

任务是根据经过的距离计算金钱成本。 这是关税计划:

  1. 1-100 公里计价为 105 美元
  2. 100-300 公里估价为 55 美元
  3. 300-any 计算为 30 美元

如果经过的距离是 305 公里,那么金钱成本是 100 公里 x 105 美元 + 200 公里 x 55 美元 + 5 公里 x 30 美元 = 100 * 105 + 200 * 55 + 5 * 30 = 21650 美元

对如何改进以下代码有什么建议吗? 我真的希望它灵活、清晰、快速。关税计划可以随时扩大到更大的规模(更多记录)。我真的不喜欢 foreach 循环,但我没有其他方法。

$distance = 305;
$prices = [
     105 => [1, 100],
     55 => [101, 300],
     30 => [301, 99999],
];
 $cost = 0;
 for ($i = 1; $i <= $distance; $i++) {
     foreach ($prices as $price => $kilometres) {
        if ($i >= $kilometres[0] && $i <= end($kilometres)) {
            $cost = $cost + $price;
        }
     }
 }
 $over_km = $distance - 99999;
 if ($over_km > 0) {
    $cost = $cost + $over_km * 30;
 }

【问题讨论】:

    标签: php coding-style refactoring


    【解决方案1】:
        <?php
        $distance = 305;
        $pricing = [
            [
                'threshold' => 100,
                'price' => 105
            ],
            [
                'threshold' => 300,
                'price' => 55
            ],
            [
                'threshold' => PHP_INT_MAX,
                'price' => 30
            ]
        ];
    
        $price = 0;
        $offset = 0;
    
        foreach ($pricing as $priceinfo) {    
            $delta = ($distance + $offset > $priceinfo['threshold']) ? $priceinfo['threshold'] - $offset : $distance;
            $price += $delta * $priceinfo['price'];
            $distance -= $delta;
            $offset += $delta;
            if ($distance == 0) break;
        }
        echo $price;
    

    使用一系列阈值,并在达到阈值时调整定价。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2021-11-11
      • 2020-06-22
      • 2012-12-23
      • 2011-01-18
      • 2010-11-03
      相关资源
      最近更新 更多