2013-10-14 5 views
0

Я создаю систему уровня вверх для блога wordpress. Я считаю, что этот вопрос больше связан с Php и математикой, а не с Wordpress, поэтому я задаю здесь вопрос.Простые вычисления прогресса уровня PHP

Я хочу, чтобы пользователи получали «уровни», когда пользовательские поля (или вы можете назвать это xp) настраивают поле в несколько раз (Хотя я бы предпочел, чтобы требование xp увеличивалось экспоненциально, пожалуйста, посмотрите на запрос # 2 ниже).

У меня есть это в моем functions.php файл.

function movie_level() { 
    if (is_single()) { 
     global $post; 
     $movie_level = get_post_meta($post->ID, "movie_level", true); 
     if (!isset($movie_level) OR empty($movie_level) OR !is_numeric($movie_level)) { 
    $movie_level = 1; 
    add_post_meta($post->ID, "movie_level", $movie_level); 
     } 
    $vmeta = get_post_meta(get_the_ID(), 'ratings_score', true); 
    $movie_percentage_check = $vmeta/(25*$movie_level) * 100; 
    if ($movie_percentage_check == 100) { 
     $new_level = $movie_level + 1; 
     update_post_meta($post->ID, "movie_level", $new_level); 
     $update_rating = $vmeta + 1; 
     update_post_meta($post->ID, "ratings_score", $update_rating); 
     } return $movie_level; 
    } 
} 

Что она делает это добавить +1 к movie_movie уровня, когда рейтинги достигают 25.

В моем файле single.php я следующее:

$meta = get_post_meta(get_the_ID(), 'ratings_score', true); 
$level= movie_level(); 
$perc = $meta/(25 * $level) * 100; 

echo '<div class="progress large-6 small-12 columns "><span class="meter" style="width:'.$perc.'%"><span></span></span></div>'; 

echo movie_level(); 

Это показывает прогресс на следующий уровень с помощью компонента css.

просит
  1. Как я могу сделать $ перхлорэтилен начинается с 0% снова, когда будет достигнут новый уровень? При моем текущем уравнении индикатор выполнения всегда будет показывать прогресс, начиная с уровня 1 - уровень 3 (например), а не уровня 2 - уровень 3.

  2. Как обновить код, чтобы требования к рейтингам экспоненциально возрастали каждый уровень и еще добиться того, чего я хотел в запросе # 1

+0

Вы пробовали что-либо для выполнения дополнительных запросов? Покажите этот код, если он у вас есть. – naththedeveloper

+0

Если вы хотите рассчитать проценты по значениям со «смещением», то, конечно, вы должны вычесть это смещение от обоих значений раньше. Допустим, что уровень 7 начинается с 400 очков, уровень 8 - 500, а у пользователя в настоящее время 471 балл. 500 - 400 - 100, 471 - 400 - 71 - составляет 71% «на» уровне семь. Работает так же, если значения не так «красиво» выбраны, как в этом примере, конечно. – CBroe

+0

Вы имеете в виду '(5 * $ level)' во втором блоке кода, должно быть '25'? В противном случае я смущен, откуда приходит «5». – SpaceDog

ответ

1

Я думаю, что вы прыгать через несколько обручей, которые вам не нужны, но несколько нот первый.

movie_level В функции вы Проверяетесь потребности на уровне увеличиваются, это имеет смысл только, чтобы сделать это проверить, когда связанные с ними переменными изменились - т.е. сделать изменения при обновлении movie_level или ratings_score. Также вы возвращаете movie_level, но это не отражает + 1, если вы его добавили, так что вы всегда возвращаете старую оценку (как вы используете new_level, чтобы сохранить новую оценку). Это может быть то, что вы намереваетесь, но я подозреваю, что это не так.

Ключевой вопрос, на который вы пытаетесь ответить, - как далеко до следующего уровня? Для блоков 25 следующий уровень - (movie_level * 25), а сумма до следующего уровня - (movie_level * 25) - rating_score. В процентах это ((movie_level * 25) - rating_score)/25 (возможно, * 100, если хотите).

Это работает с фиксированными блоками, для экспоненциальных блоков вы можете явно хранить следующую цель в качестве переменной. Но вы можете применить ту же логику, что и выше, предположите, что функция level_target(x) возвращает целевую оценку уровня x. Тогда вы можете решить, как далеко идти с level_target(movie_level) - rating_score, но вам нужно знать размер этого уровня, который равен level_target(movie_level) - level_target(movie_level - 1).

Таким образом, чтобы получить процент делать: (level_target(movie_level) - rating_score)/(level_target(movie_level) - level_target(movie_level - 1))

Вы можете реализовать level_target как функцию, или работать, что вы хотите, и включить его непосредственно, которые позволили бы упростить уравнение.

Увеличение экспоненциального уровня будет очень быстрым, поэтому вам может понадобиться максимум. Но если вы хотите

0, 25, 50, 100, 200, 400 ... 

Вы можете отметить, что это эквивалентно

25 * 0, 25 * 1, 25 * 2, 25 * 4, 25 * 8, 25 * 16 ... 

, а затем отметить, что последовательность 0, 1, 2, 4, 8, 16 ... просто увеличение полномочий два. Итак, level_target(x) = 25 * pow(2,x).

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

EDIT

Для уточнения моего изменения поля комментария. Вам нужно только пересчитать уровень movie_level после изменений rating_score (или наоборот), поэтому обычно вы будете пересчитывать переменные только тогда, когда они меняются.

Я не знаю вашего приложения, но предполагаю, что существует только одна страница, где значения movie_level и/или rating_score могут меняться (например, страница редактирования оценки), но есть десятки других страниц, которые показывают прогресс бар. Если вы проверите ($movie_percentage_check == 100) только на странице, где значения меняются, вам не нужно проверять где-либо еще (потому что значения не могут измениться нигде, чтобы вы знали, что это не так).

Не обязательно плохо проверять это на всех страницах просмотра, особенно на простом сайте. И есть случаи, когда вам нужно (если какая-то другая часть системы может каким-то образом обновить значения). В более сложной системе вы хотите избежать работы, которой вам не нужно, поэтому только «редактировать» страницы должны изменять значения, «просмотр» страниц должен просто читать/использовать значения.

Возможно, я не объяснил это, надеюсь, это поможет.

+0

Спасибо, математика отлично выглядит! Я все понимаю, кроме того, что обнаружил, что поле изменилось. У вас есть пример, на который я могу ссылаться ?. Также я понимаю, что вы говорите о быстром увеличении, если я использую экспоненциальный рост, даже кубический рост также увеличивается. Думаете, я должен просто придерживаться фиксированных блоков ?. – user28123

+0

Выбор увеличения действительно зависит от ваших пользователей и от того, что вы делаете. Вы также можете добавлять процент каждый раз, увеличение 25 + 20% дает 0, 25, 55, 91, но вы получите нецелые числа, так как следующее число равно 134.2. – SpaceDog

+0

Хорошо, думаю, я понимаю. Функция должна проверять, когда изменяется рейтинг_score, а не постоянно проверять, чтобы значение параметра movie_level равнялось 100. Рейтинг_score изменяется, когда кто-то нажимает кнопку на странице сообщения, чтобы дать * thumbs up * (выполняется через ajax с помощью плагина).Я сделаю кое-что, чтобы найти, как обнаружить изменение значений, используя php. Вы хотите обновить мои выводы? Кроме того, 25 + 20% дает разумное увеличение. Будет ли использовать intval для сохранения их в целых числах? – user28123

Смежные вопросы