[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите оптимизировать код.
Tosik
Не знаю почти нечего в php. Набросал скрипт вывода статистики игроков, онлайн игры. Прошу помочь, оптимизировать его.
Тут аккуратно выложить его не получается, достаточно большой файл получился. Пожалуйста отпишитесь в теме кто сможет мне помочь. Я пришлю в ЛС.



Спустя 3 часа, 50 минут, 33 секунды (8.11.2009 - 12:24) Soldier Ghost написал(а):
А ты всё равно выкладывай )

Спустя 14 минут, 5 секунд (8.11.2009 - 12:38) Tosik написал(а):

Спустя 14 минут, 23 секунды (8.11.2009 - 12:52) Grazor написал(а):
blink.gif
а количество опыта нельзя высчитывать по какой-либо формуле?
ну или хотя бы в функцию вынести, чтобы не писать одно и то же 5 раз
а я бы ещё case-ом записал

Спустя 21 минута, 46 секунд (8.11.2009 - 13:14) Tosik написал(а):
Цитата (Grazor @ 8.11.2009 - 09:52)
blink.gif
а количество опыта нельзя высчитывать по какой-либо формуле?
ну или хотя бы в функцию вынести, чтобы не писать одно и то же 5 раз
а я бы ещё case-ом записал

Формулы нет.
Етсь такое:
 function setLevel($exp)
{
$lvl=0;
$d = new DOMDocument();
$filex = static_dir."player_experience_table.xml";
if ($f = @fopen($filex, "r", true)){
fclose($f);
}
else{
$this->setError("Error loading <b>".$filex."</b>");
return null;
}
$d->load($filex);
if(!$d->schemaValidate (static_dir.'player_experience_table.xsd'))
$this->setError('Error validate <b>'.$filex.'</b>');
$n = $d->getElementsByTagName('exp');
while (($lvl+1) < $n->{'length'} & $exp >= $n->item($lvl)->textContent) $lvl++;
$this->statsvalue['level']=$lvl;
}

Только мне ума не хватает прикрутить.
Вот содержание xml
<?xml version="1.0" encoding="UTF-8"?>
<player_experience_table
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="player_experience_table.xsd">
<exp>
0</exp> <!-- level 1 -->
<exp>650</exp> <!-- level 2 -->
<exp>1917</exp> <!-- level 3 -->
<exp>4230</exp> <!-- level 4 -->
<exp>8693</exp> <!-- level 5 -->
<exp>14583</exp> <!-- level 6 -->
<exp>22885</exp> <!-- level 7 -->
<exp>34936</exp> <!-- level 8 -->
...........................

А вот xsd.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema
version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element
name="player_experience_table">
<xs:complexType>
<xs:sequence>
<xs:element
name="exp" type="xs:long" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>



Я думал о том что в начале задать переменные а патом выводить их в разном виде и т.д. Ток не получилось, были какие-то причины. Вот и прошу помощи.

Спустя 24 минуты, 7 секунд (8.11.2009 - 13:38) sergeiss написал(а):
Давай рассмотрим часть кода:
            if ($row["exp"] >= "0")
$level = "1";
if ($row["exp"] >= "650")
$level = "2";
if ($row["exp"] >= "1917")
$level = "3";
if ($row["exp"] >= "4230")
$level = "4";
if ($row["exp"] >= "8693")
$level = "5";
if ($row["exp"] >= "14583")
$level = "6";

Этот "китайский кодинг" лучше заменить на одну строку
$level=get_level( $row['exp'] );

где get_level - это функция, которую надо сделать. Типа такой:
function get_level( $exp )
{
$bound=array( 1=>0, 650, 1917, 4230, ...); // вместо многоточия - все числа
// либо - задаешь формулой эти числа в массиве

// далее проходишь по массиву циклом, сравниваешь с границами, и если находишь подходящее число, то возвращаешь его ключ - это и будет как раз нужный уровень;
// но как это сделать - подумай сам. Это просто smile.gif

}

Спустя 3 часа, 48 минут, 10 секунд (8.11.2009 - 17:26) sergeiss написал(а):
Я вернулся, ездил тут по делам разным. Продолжаю "разбор полетов".

Вот такой (также "китайский" smile.gif) кодинг
            if ($row["player_class"] == "WARRIOR")
$player_class = "<font size='2'>Warrior</font>";
if ($row["player_class"] == "GLADIATOR")
$player_class = "<font size='2'>Gladiator</font>";
if ($row["player_class"] == "TEMPLAR")
$player_class = "<font size='2'>Templar</font>";
if ($row["player_class"] == "SCOUT")
$player_class = "<font size='2'>Scout</font>";
if ($row["player_class"] == "ASSASSIN")
$player_class = "<font size='2'>Assassin</font>";

(я специально беру только часть кода, про остальное сам догадаешься) можно заменить на такой:
$pclass=array( 'WARRIOR'=> 'Warrior', 'GLADIATOR' => 'Gladiator', 'TEMPLAR' => ' Templar', ...и так далее...);
// и выставляем нужное значение одной строкой кода;
// если в массиве $pclass есть нужный ключ, то берем оттуда значение; иначе - назначаем пустую строку

$player_class =( isset( $pclass[ $row['player_class'] ] ) ? "<font size='2'>".$pclass[ $row['player_class'] ].'</font>' : '';

И аналогичный алгоритм можно использовать для любых назначений, вместо целой "пачки" ИФов.
Преимущества такого подхода:
- компактный код
- массив можно загрузить из файла или из БД, что увеличивает универсальность кода; при любых добавках не надо править сам скрипт, достаточно поменять только данные в файле.

Спустя 22 минуты, 25 секунд (8.11.2009 - 17:49) sergeiss написал(а):
Далее.

Код типа
            echo "<td><font size='2'>" . ++$i . "</font></td>";
echo "<td><font size='2'>" . $row["name"] . "</font></td>";
echo "<td><font size='2'>" . $level . "</font></td>";
echo "<td><font size='2'>" . $gender . "</font></td>";

Можно заменить на вызов созданной тобой функции
one_element_out( ++$i );
one_element_out( $row['name'] );
// а сама функция будет выглядеть так
function one_element_out( $element )
{
echo '<td><font size="2"'.$element.'</font></td>';
}

Спустя 44 минуты, 36 секунд (8.11.2009 - 18:33) Tosik написал(а):
Спасибо. Что-то понял, с чем-то постораюсь разобраться. Глянь пожалуйста начало...

$msconn = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$msconn)
die("Ошибка соединения. Скорее всего игровой сервер неактивен, попробуйте зайти сюда позже.");
if (!mysql_select_db($dbname))
die("БД не найдена! Скорее всего эта ошибка вызвана сбоем на сервере.");
$q = mysql_query("SELECT name, exp, gender, race, player_class, online FROM players");
if (!$q)
die("Ошибка, при получении данных из базы.");
$row = mysql_fetch_array($q)
$level=get_level( $row['exp'] );
function get_level($exp)
{
$level=0;
$d = new DOMDocument();
$filex = static_dir."player_experience_table.xml";
if ($f = @fopen($filex, "r", true)){
fclose($f);
}
else{
$this->setError("Error loading <b>".$filex."</b>");
return null;
}
$d->load($filex);
if(!$d->schemaValidate (static_dir.'player_experience_table.xsd'))
$this->setError('Error validate <b>'.$filex.'</b>');
$n = $d->getElementsByTagName('exp');
while (($level+1) < $n->{'length'} & $exp >= $n->item($lvl)->textContent) $level++;
$this->statsvalue['level']=$level;
}

Спустя 4 минуты, 51 секунда (8.11.2009 - 18:38) Tosik написал(а):
Хочу сначала задать переменные, а потом их выводить, в разных видах.

Спустя 4 минуты, 37 секунд (8.11.2009 - 18:43) sergeiss написал(а):
Цитата (Tosik @ 8.11.2009 - 19:38)
Хочу сначала задать переменные, а потом их выводить, в разных видах.

А вопрос-то в чем?

Спустя 5 минут, 1 секунда (8.11.2009 - 18:48) Tosik написал(а):
Цитата (sergeiss @ 8.11.2009 - 15:43)
Цитата (Tosik @ 8.11.2009 - 19:38)
Хочу сначала задать переменные, а потом их выводить, в разных видах.

А вопрос-то в чем?

Я до этого выложил код.
В этом месте пишит ошибка.
$row = mysql_fetch_array($q)
$level=get_level( $row['exp'] ); -Именно в этой строке.



Как мне после Получения инфы из таблицы, получать её по переменной $row['название столбца.'] ?


Спустя 17 минут, 10 секунд (8.11.2009 - 19:05) sergeiss написал(а):
Цитата (Tosik @ 8.11.2009 - 19:48)
Как мне после Получения инфы из таблицы, получать её по переменной $row['название столбца.'] ?

замени mysql_fetch_array на mysql_fetch_assoc.

Я что-то на это даже и не посмотрел сначала.

Спустя 2 минуты, 57 секунд (8.11.2009 - 19:08) Soldier Ghost написал(а):
игра WOW ? да помню я в неё и днём и ночью играл laugh.gif

Спустя 1 минута, 33 секунды (8.11.2009 - 19:09) Tosik написал(а):
Цитата (Soldier Ghost @ 8.11.2009 - 16:08)
игра WOW ? да помню я в неё и днём и ночью играл laugh.gif

Игра Aion.

Спустя 15 минут, 18 секунд (8.11.2009 - 19:25) Tosik написал(а):
function get_level( $exp )
{
$bound=array( 1=>0, 650, 1917, 4230, ...); // вместо многоточия - все числа
// либо - задаешь формулой эти числа в массиве

// далее проходишь по массиву циклом, сравниваешь с границами, и если находишь подходящее число, то возвращаешь его ключ - это и будет как раз нужный уровень;
// но как это сделать - подумай сам. Это просто

}


Можешь расписать?sad.gif Не догоняю малость:(
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.