私の質問は、これらの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
は、0 より大きい値もアセットにする必要があります。これを次のように行うことができます。
$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
これが、レベル/500 の値で全ステップのみを取得する理由です。
できるだけ数学用語を使わないようにしています。より正式なものが必要な場合は、ウィキペディアのページを確認してください。説明が必要な場合はお知らせください
これがこの問題に関する私のアプローチです。単一行の数式よりも優れているわけではありませんが、変更可能にするために、私は通常、この種のソリューションを決定します。
$min = 100;
for($i=3500; $i<=5000; $i+=500)
{
if($l <= $i) break;
$min += 20;
}
//Now $min has got desired value.
関数は次のように表現できます。
f(x) := a * x + b
ラインの傾きは次のように計算されます。
a := 20 / 500
見つけるb
には、線上にある値を推定する必要があります。この場合、それは3500
(x) と120
(f(x)) になります。それはうまくいきます-40
。
したがって、関数は次のようになりました。
f(x) := (20 / 500) * x - 40
次の 2 つの特殊なケースがあります。
3500
の値の左はのf(x)
ままでなければなりません。100
両方のケースが適用されます:
$min = max(100, ceil($l / 500) * 20 - 40)