PHP функция для соответствия ключу в диапазоне значений - PullRequest
1 голос
/ 23 марта 2011

У меня есть массив с соответствием lvl=>xp, и я бы сделал функцию, которая возвращает lvl для определенного xp.как $lvl = getLvlOf(15084); //return 5

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

Я ищу самый простой и не требующий ресурсов способ сделать это.

Извините за мой плохой английский: (* ​​1008 *

Ответы [ 5 ]

4 голосов
/ 23 марта 2011

Предполагая, что значения уровня в массиве сохраняются отсортированными, например, (это 100 200 300, 400 и т. д., а не 200 500 100 300 400), тогда простое сканирование поможет:

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

Это выполнит итерацию по всему массиву и выпрыгнет, как только уровень XP в массиве станет больше, чем уровень XP, который вы ищете, оставив ключ этого "последнего" уровня в $ last_key

1 голос
/ 23 марта 2011

Похоже, ваш массив может быть вычислен в реальном времени -

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

Вы можете сделатьто же самое наоборот, в O (1):

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

Я округлил уравнение, так чтоможет быть проблемой +/- 1

Удачи!

1 голос
/ 23 марта 2011
function getLvlOf($lvl, $int){
        foreach($lvl as $level=>$exp){
                if($exp > $int){
                        return $level-1;
                }
        }
}

это O (n), так что никакой магии нет ...

0 голосов
/ 23 марта 2011

Не хорошо, если у вас очень высокие значения уровня, но:

$lvl = $lvl_correspondance[array_search(
                                 max(array_intersect(
                                           array_values($lvl_correspondance),
                                                        range(0,$points)
                                                       )
                                    ),
                                 $lvl_correspondance
                                )];
0 голосов
/ 23 марта 2011

Вы можете использовать array_flip , если уровни xp различны.Затем вы можете просто получить доступ к номеру уровня, используя xp в качестве индекса:

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

РЕДАКТИРОВАТЬ: Но, возможно, лучше было бы выбрать функцию даже для уровней xp между

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...