PHP函数匹配一系列值中的键

时间:2011-03-23 15:58:56

标签: php arrays function

我有一个lvl=>xp对应的数组,我会创建一个返回特定xp的lvl的函数。比如$lvl = getLvlOf(15084); //return 5

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

我搜索最简单,无需资源的方式来做到这一点。

抱歉我的英语不好:(

5 个答案:

答案 0 :(得分:4)

假设数组中的级别值保持排序,例如(它是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 :(得分:1)

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

它是O(n)所以没有魔法......

答案 2 :(得分:1)

看起来您的数组可以实时计算 -

  

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

您可以在O(1)中执行相反的操作:

  

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

我舍入了等式,因此可能存在+/- 1问题

祝你好运!

答案 3 :(得分:0)

如果您的级别值非常高,那就不好了,但是:

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

答案 4 :(得分:-2)

如果xp级别不同,您可以使用array_flip。然后,您只需使用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;
}