如何通过比较一个数组和另一个数组的数据来检查最高条件?

问题描述 投票:0回答:1

我想根据给定的规则申请折扣:

  • 如果数量大于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***
php multidimensional-array
1个回答
0
投票

您可以将

$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***
© www.soinside.com 2019 - 2024. All rights reserved.