场景
如某xx计费规则:
当用户使用318的时候,价格 = 100*330 + (300-100)*300 + 18*280 = 98040
使用量 | 价格 |
(0,100] | 330 |
(100,300] | 300 |
(300,500] | 280 |
(500,1000] | 220 |
(1000,2000] | 150 |
(2000, ∞] | 80 |
算法
<?php
// 构建规则,这里可以使用两个数组
$rules = [
330=>[0,100],
300=>[100,300],
280=>[300,500],
220=>[500,1024],
150=>[1024,3*1024],
36=>[100*1024, PHP_INT_MAX],
];
// print_r($rules);
function calc($used, $rules){
$sum = 0;
foreach ($rules as $key => $value){
// 大于计费段
if($used < $value[0]) break;
// 累加前期计费
if($used >= $value[1]) {
$sum += $key * ($value[1] - $value[0]);
}
// 在最后计费段内
if($value[0] < $used && $used <= $value[1]){
$sum += ($used - $value[0]) * $key;
}
}
return round($sum, 2);
}
echo calc(318, $rules);