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

kb5ga3dv  于 2023-04-28  发布在  PHP
关注(0)|答案(2)|浏览(99)

我想根据给定的规则应用折扣:

  • 如果数量大于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***
6tqwzwtp

6tqwzwtp1#

您可以从最高键到最低对$rules数组进行排序。这意味着如果我们遇到阈值,我们不需要为较低的规则进行更多的迭代:

uksort($rules, fn($a, $b) => $b - $a);

您可以稍微修改计算语句以使其更精简,尽管这是更风格化的调整:

$finalPrice *= (1 - ($v / 100));

对于折扣字符串,我假设星号对应于10的倍数,对应于应用的折扣:

$discount = str_repeat('*', round($k / 10));

最后,我们在ifbreak,因为我们不需要为当前项处理任何规则。节省了一些迭代周期。
把这些放在一起:

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***
webghufk

webghufk2#

你很接近了有两样东西不见了:
既然你用

if ($item['qty'] >= $k) {

你需要按照键的降序对$rules数组进行排序,像这样:

$rules = [ 10 => 5, 20 => 10, 30 => 15 ];
krsort($rules);

第二步是在内部循环中添加 break 语句:

foreach ($rules as $k => $v) {
  if ($item['qty'] >= $k) {
    $finalPrice -= ( $finalPrice * ( $v / 100 ) );
    // $discount .= '*';   
    break;   // Discount found, so stop testing for other discounts
  }
}

现在输出将是:
那条线

$discount .= '*';

被注解掉了,因为它不再有意义。它显示了折扣适用的频率。如果目的是显示折扣的大小- 5打印:* ,10张打印:,15个打印:*-,那么这一行将产生该输出:

$discount = str_repeat('*', $v / 5);

相关问题