我的问题是如何用数学公式替换那些 if ?
if ($l <= 3500)
{
$min = 100;
}
elseif ($l <= 4000)
{
$min = 120;
}
elseif ($l <= 4500)
{
$min = 140;
}
elseif ($l <= 5000)
{
$min = 160;
}
如您所见,每 500 个级别提高 20 个。
我的问题是如何用数学公式替换那些 if ?
if ($l <= 3500)
{
$min = 100;
}
elseif ($l <= 4000)
{
$min = 120;
}
elseif ($l <= 4500)
{
$min = 140;
}
elseif ($l <= 5000)
{
$min = 160;
}
如您所见,每 500 个级别提高 20 个。
如您所见,每 500 个级别提高 20 个。
嗯,这就是你的公式。
$min = 100 + ceil(($l-3500)/500) * 20;
$l
开始时少了 3500。ceil()
的结果是因为我们只想在传递整个值时跳转。如果我们要解决$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>
。那是什么东西?
就像你说的,每 500 级你提高 20 级。所以我们知道我们20/500
每 1 级移动一次(因为好吧,如果我们将它乘以 500,我们就得到了我们的原始规则)。我们也知道(从以前)我们从 开始3500
。
现在,我们可能很想使用$min = 100 + ($l-3500) * (20/500);
,这几乎是正确的。这里唯一的问题是您只需要整数值。这就是为什么我们ceil
将 level/500 的值仅用于获取整步。
我试图用尽可能少的数学术语来保持这一点,如果你想要更正式的东西,你可以查看维基百科页面。如果您需要任何澄清 - 让我知道
You can express the function as follows:
f(x) := a * x + b
The inclination of the line is calculated as:
a := 20 / 500
To find b
you need to extrapolate a value that's on the line; in this case, that could be 3500
(x) and 120
(f(x)). That works out to be -40
.
So the function has become:
f(x) := (20 / 500) * x - 40
There are two special cases:
3500
the value of f(x)
must remain 100
, even though f(x) is less.Both cases applied:
$min = max(100, ceil($l / 500) * 20 - 40)
这是我关于这个问题的方法。它并不比单行公式好,但为了可修改,我一般决定这种解决方案:
$min = 100;
for($i=3500; $i<=5000; $i+=500)
{
if($l <= $i) break;
$min += 20;
}
//Now $min has got desired value.