Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace elseifs with math

My question is how could I replace those if's with math formula?

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

As you see this is raising 20 for every 500 levels.

like image 242
Daniel Kmak Avatar asked Dec 30 '25 01:12

Daniel Kmak


1 Answers

As you see this is raising 20 for every 500 levels.

Well, that's your formula right there.

$min = 100 + ceil(($l-3500)/500) * 20;
  • We start with 100, our base value and add that to the rest of the calculation.
  • $l starts with 3500 less.
  • We ceil() the result since we only want to jump when we pass the whole value.
  • We multiply that by 20.

If we want to address the case where $l is less than 3500 and set 100 as the minimum value, we also need to asset that $l-3500 is more than zero. We can do this as such:

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

How did I get there?

What we're actually doing is plotting a line. Like you said yourself we go a constant amount for every constant amount. We have something called linear progression here.

Great, so we recognized the problem we're facing. We have an imaginary line to plot and we want integer values. What next? Well, let's see where the line starts?

In your case the answer is pretty straightforward.

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

That's our starting point. So we know the point (3500,100) is on our line. This means the result starts at 100 and the origin starts at 3500.

We know that our formula is in the form of 100+<something>. What is that something?

Like you said, for every 500 levels you're raising 20. So we know we move 20/500 for every 1 level (because well, if we multiply that by 500 we get our original rule). We also know (from before) that we start from 3500.

Now, we might be tempted to use $min = 100 + ($l-3500) * (20/500); and that's almost right. The only problem here is that you only want integer values. This is why we ceil the value of level/500 to only get whole steps.

I tried to keep this with as little math terminology as possible, you can check the wikipedia page if you want things more formal. If you'd like any clarification - let me know

like image 116
Benjamin Gruenbaum Avatar answered Jan 01 '26 13:01

Benjamin Gruenbaum



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!