我想根据给定的规则申请折扣:
我已经在一个数组中表达了上述规则。
但我不知道如何验证是否只满足最高可能条件
比如金额大于30,只申请15%。
知道如何解决这个问题或改进逻辑吗?
$rules=array(10=>5, 20=>10, 30=>15);
$qty=array(
array('qty'=>1, 'price'=>100),
array('qty'=>2, 'price'=>9),
array('qty'=>10, 'price'=>54),
array('qty'=>13, 'price'=>22),
array('qty'=>21, 'price'=>8),
array('qty'=>22, 'price'=>999),
array('qty'=>35, 'price'=>2),
array('qty'=>50, 'price'=>1),
);
print("qty\tprice\tfinalPrice\n");
foreach ($qty as $item) {
$finalPrice=$item['price'];
$discount="";
foreach ($rules as $k=>$v) {
if($item['qty'] >= $k) {
$finalPrice= $finalPrice - ($finalPrice * ($v / 100));
$discount.="*";
}
}
printf("%s\t%s\t%s%s\n",$item['qty'],$item['price'],$finalPrice,$discount);
}
输出:
qty price finalPrice
1 100 100
2 9 9
10 54 51.3*
13 22 20.9*
21 8 6.84**
22 999 854.145**
35 2 1.4535***
50 1 0.72675***
您可以将
$rules
数组从最高键到最低键排序。这意味着如果我们遇到阈值,我们不需要再对较低的规则进行迭代:
uksort($rules, fn($a, $b) => $b - $a);
您可以稍微修改计算语句以使其更精简,尽管这是更具风格的调整:
$finalPrice *= (1 - ($v / 100));
对于折扣字符串,我假设星号对应于应用折扣对应的 10 的倍数:
$discount = str_repeat('*', round($k / 10));
最后,我们
break
在 if
中,因为我们不需要再处理当前项目的规则。节省了一些迭代周期。
把它们放在一起:
uksort($rules, fn($a, $b) => $b - $a);
print("qty\tprice\tfinalPrice\n");
foreach ($qty as $item) {
$finalPrice=$item['price'];
$discount="";
foreach ($rules as $k=>$v) {
if($item['qty'] >= $k) {
$finalPrice= $finalPrice * (1 - ($v / 100));
$discount = str_repeat('*', round($k / 10));
break;
}
}
printf("%s\t%s\t%s%s\n",$item['qty'],$item['price'],$finalPrice,$discount);
}
会输出:
qty price finalPrice
1 100 100
2 9 9
10 54 51.3*
13 22 20.9*
21 8 7.2**
22 999 899.1**
35 2 1.7***
50 1 0.85***