用数学替换elseifs

时间:2013-10-20 06:48:37

标签: php math if-statement

我的问题是如何用数学公式替换那些?

if ($l <= 3500)
{
    $min = 100;
}
elseif ($l <= 4000)
{
    $min = 120;
}
elseif ($l <= 4500)
{
    $min = 140;
}
elseif ($l <= 5000)
{
    $min = 160;
}

如你所见,每500个级别提高20个。

3 个答案:

答案 0 :(得分:6)

  

如你所见,每500个级别提高20个。

嗯,那就是你的公式。

$min = 100 + ceil(($l-3500)/500) * 20;
  • 我们从100,我们的基础值开始,并将其添加到计算的其余部分。
  • $l以3500以下开始。
  • 我们ceil()结果,因为我们只想在传递整个值时跳转。
  • 我们乘以20。

如果我们想要解决$l小于3500并将100设置为最小值的情况,我们还需要$l-3500大于零的资产。我们可以这样做:

$min = 100 + ceil(max(0,$l-3500)/500) * 20;

我是如何到达那里的?

我们实际做的是绘制一条线。就像你自己说的那样,我们会为每一个不变的量持续量。我们在这里有一些叫做线性进展的东西。

很好,所以我们认识到了我们面临的问题。我们有一条想象线来绘制,我们想要整数值。接下来是什么?好吧,让我们看一下这条线的起点?

在你的情况下,答案非常简单。

if ($l <= 3500) {
    $min = 100;
}

这是我们的出发点。所以我们知道点(3500,100)就在我们的行上。这意味着结果从100开始,原点从3500开始。

我们知道我们的公式是100+<something>。那是什么东西?

就像你说的那样,你每提升20个等级就有20个。所以我们知道每1个等级移动20/500(因为如果我们将它乘以500得到我们的原始规则)。我们也知道(从以前)我们从3500开始。

现在,我们可能会想要使用$min = 100 + ($l-3500) * (20/500);并且几乎。这里唯一的问题是你只需要整数值。这就是为什么我们ceil等级/ 500的值只能得到整个步骤。

我尽量用尽可能少的数学术语来保持这一点,如果你想要更正式的东西,你可以检查the wikipedia page。如果您想要任何澄清 - 请告诉我

答案 1 :(得分:0)

以下是我对此问题的处理方法。它并不比单线公式更好,但为了可修改,我通常会决定这种解决方案:

$min = 100;
for($i=3500; $i<=5000; $i+=500)
{
   if($l <= $i) break;
   $min += 20;
}
//Now $min has got desired value.

答案 2 :(得分:0)

您可以按如下方式表达该功能:

f(x) := a * x + b

线的倾斜度计算如下:

a := 20 / 500

要查找b,您需要推断线上的值;在这种情况下,可以是3500(x)和120(f(x))。这可能是-40

因此该功能已成为:

f(x) := (20 / 500) * x - 40

有两种特殊情况:

  1. 3500左侧f(x)的值必须保持100,即使f(x)较小。
  2. 倾斜不是连续的而是离散的。
  3. 两种情况都适用:

    $min = max(100, ceil($l / 500) * 20 - 40)