Yoann
Yoann

Reputation: 5077

PHP function to match key in a range of values

I have a array with the lvl=>xp correspondance and I would make a function that return the lvl for a specific xp. like $lvl = getLvlOf(15084); //return 5

$lvl_correspondance = array(
    1=>100,
    2=>520,
    3=>2650,
    4=>6588,
    5=>12061,
    6=>23542,
    ...
    n=>xxxxxx
);

I search the easyest and ressourceless way to do it.

Sorry for my poor english :(

Upvotes: 1

Views: 905

Answers (5)

Mark Baker
Mark Baker

Reputation: 212412

Not good if you have very high level values, but:

$lvl = $lvl_correspondance[array_search(
                                 max(array_intersect(
                                           array_values($lvl_correspondance),
                                                        range(0,$points)
                                                       )
                                    ),
                                 $lvl_correspondance
                                )];

Upvotes: 0

Czechnology
Czechnology

Reputation: 14992

You can use array_flip if the xp levels are distinct. Then you can simply access the level number using the xp as index:

$levels = array_flip($lvl_correspondance);
$lvl = $levels[15084];

EDIT: But maybe a function would be better to fetch even the xp levels in between:

function getLvlOf($xp) {
  // get the levels in descending order
  $levels = array_reverse($GLOBALS['lvl_correspondance'], true);

  foreach ($levels as $key => $value) {
    if ($xp >= $value)
      return $key;
  }

  // no level reached yet
  return 0;
}

Upvotes: -2

Mikhail
Mikhail

Reputation: 9007

It looks like your array can be computed live -

XP = exp( 3 * ln(LVL) + 4 ) * 2

You can do the same in reverse, in O(1):

LVL = exp(ln(XP/2) - 4 / 3)

I rounded the equation, so there may be a +/- 1 issue

Good Luck!

Upvotes: 1

sharpner
sharpner

Reputation: 3937

function getLvlOf($lvl, $int){
        foreach($lvl as $level=>$exp){
                if($exp > $int){
                        return $level-1;
                }
        }
}

it's O(n) so no magic there...

Upvotes: 1

Marc B
Marc B

Reputation: 360662

Assuming the level values in the array are kept sorted, e.g. (it's 100,200,300, 400, etc... and not 200,500,100,300,400), then a simple scan will do the trick:

$xp = 15084;
$last_key = null;
foreach($lvl_correspondenance as $key => $val) {
    if ($val < $xp) {
        $last_key = $key;
    } else {
        break;
    }
}

That'll iterate through the array, and jump out as soon as the XP level in the array is larger than the XP level you're looking for, leaving the key of that "last" level in $last_key

Upvotes: 4

Related Questions