Я бы кое-что поправил.
1. Запросто может быть необходимость дергать getCurrentLevel() несколько раз за время выполнения скрипта для разных игроков, соотв. надо бы закешировать (в статик-поле) чтение xml-ки.
2. Искать в отсортированном массиве лучше все-таки бинарным поиском. Итераций меньше.
PHP код:
<?php
/**
* Класс PlayerInfo
* @author PROGRAMMATOR <admin@zone-game.info>
* @link http://forum.zone-game.info/showthread.php?t=10110
* @copyright http://zone-game.info
*/
class PlayerInfo
{
const PLAYER_EXPERIENCE_TABLE_FILE = 'player_experience_table.xml';
private static $playerExperienceTable = array();
/**
* Конструктор класса PlayerInfo
*/
public function __construct() {
// здесь может быть ваш код ;)
}
/**
* Метод определения текущего уровня персонажа
* @param <int> $experience количество exp
* @return <int> текущий уровень
*/
public function getCurrentLevel($experience) {
$expList = self::getPlayerExperienceTable();
$maxLevel = sizeof($expList) - 1;
if ($experience <= 0) {
return 1;
}
if ($experience >= $expList[$maxLevel]) {
return $maxLevel;
}
$iMin = 1;
$iMid = 0;
$iMax = $maxLevel;
while (($iMax - $iMin) > 1) {
$iMid = ($iMin + $iMax) >> 1;
if ($experience == $expList[$iMid]) {
return $iMid;
} elseif ($experience > $expList[$iMid]) {
$iMin = $iMid;
} elseif ($experience < $expList[$iMid]) {
$iMax = $iMid;
}
}
return $iMin;
}
/**
* Метод разбора XML файла player_experience_table.xml
* @return <array> собранный массив $level => $exp
*/
private static function getPlayerExperienceTable() {
if (sizeof(self::$playerExperienceTable) == 0) {
$xml = simplexml_load_file(realpath(dirname(__FILE__)) . '/' . self::PLAYER_EXPERIENCE_TABLE_FILE);
foreach ($xml->exp as $key => $value) {
self::$playerExperienceTable[] = $value;
}
}
return self::$playerExperienceTable;
}
}
?>