递归计算阶梯价格

场景描述

假定一段距离配送距离加价规则如下:

  • 起送价8元
  • 2-6公里内,每增加1公里,配送费用增加2元
  • 6-10公里内,每增加2公里,配送费用增加3元
  • 10公里以上,每增加5公里,配送费用增加6元
    /**
     * @param $items [{"distance":2,"step":1,"inc_fee":2},{"distance":6,"step":2,"inc_fee":3},{"distance":10,"step":5,"inc_fee":6}]
     * @param $distance int 距离
     * @param $fee int 基础费用,起送价
     * @return float|int
     */
    public function recursionRideItem($items, $distance, $fee)
    {
        for ($i = 0; $i < count($items); $i++) {
            $out_distance = $distance - $items[$i]['distance'];// 超出当前取件的距离
            if(isset($items[$i+1])) {
                // 仍然有上限的情况下,累计当前区间的跑腿费用
                $fee += $items[$i]['inc_fee'] * ceil(($items[$i+1]['distance'] - $items[$i]['distance']) / $items[$i]['step']);
                // 删除当前单元
                array_splice($items, $i, 1);
                // 继续递归计算下一个区间费用信息
                $fee = $this->recursionRideItem($items, $distance, $fee);
                break;
            }
            else// 达到最高区间范围,计入累计金额即可
                $fee += $items[$i]['inc_fee'] * ceil($out_distance / $items[$i]['step']);
        }
        return $fee;
    }

你可能感兴趣的:(递归计算阶梯价格)