我想根据给定的规则应用折扣:
- 如果数量大于10件,则适用5%的折扣
- 如果数量大于20件,适用10%的折扣
- 如果数量大于30件,适用15%的折扣
我已经在一个数组中表示了所述规则。
但我不知道如何验证只有最高可能的条件得到满足。
例如,如果数量大于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***
2条答案
按热度按时间6tqwzwtp1#
您可以从最高键到最低对
$rules
数组进行排序。这意味着如果我们遇到阈值,我们不需要为较低的规则进行更多的迭代:您可以稍微修改计算语句以使其更精简,尽管这是更风格化的调整:
对于折扣字符串,我假设星号对应于10的倍数,对应于应用的折扣:
最后,我们在
if
中break
,因为我们不需要为当前项处理任何规则。节省了一些迭代周期。把这些放在一起:
将输出:
webghufk2#
你很接近了有两样东西不见了:
既然你用
你需要按照键的降序对$rules数组进行排序,像这样:
第二步是在内部循环中添加 break 语句:
现在输出将是:
那条线
被注解掉了,因为它不再有意义。它显示了折扣适用的频率。如果目的是显示折扣的大小- 5打印:* ,10张打印:,15个打印:*-,那么这一行将产生该输出: