我有一个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
);
我搜索最简单,无需资源的方式来做到这一点。
抱歉我的英语不好:(
答案 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;
}