2011-01-12 3 views
2

Ну, я думаю о добавлении функции оценки в мое приложение, где участники могут голосовать от 1 до 5 (это $rating), и я показываю средний балл, как $score = $number_of_voters/$rating. Где $number_of_voters - общее количество участников, проголосовавших по этому конкретному предмету, а $rating - это общий рейтинг для этого конкретного предмета.PHP интенсивность/сила?

Таким образом, $score не может быть выше 5 (из-за его отсутствия).

Однако я думаю об интеграции интенсивности/силы голосования в соответствии с уровнем RPG пользователей (который представляет собой число от 1 до 8, которое постепенно может увеличиваться - каждый член назначается), поэтому, если, например, они проголосовали и их уровень RPG был 1, средний балл не будет слишком отличаться от предыдущего (не повлияет на него слишком сильно), однако, если это было что-то вроде 8, то это повлияло бы на это больше? (слишком резкое изложение их уровня RPG будет учитываться внутри страны при голосовании).

Но не уверен, как действовать (как интегрировать/внедрять), не выполняя первоначальную спецификацию (т. Е. Я не хочу, чтобы оценка была выше, чем 5 (хочу, чтобы она была равна $ score < = 5)).

+0

$ score = $ number_of_voters/$ rating? что это значит...вы имеете в виду $ score = $ number_of_voters (рейтинг = 1)/1 + $ number_of_voters (рейтинг = 2)/2 и т. д. – Jason

+0

@Jason я редактировал мой intial quesiton/post с дополнительной информацией - см. его :) – newbtophp

ответ

2

Для решения немедленного вопроса, вы можете умножить дробный весом 0-1. Если у вас есть разные уровни, вы можете получить этот вес, разделив уровень пользователя на максимальный уровень.

Но прежде чем вы начнете кодирование, вы должны прочитать How Not To Sort By Average Rating, чтобы избежать некоторых распространенных ошибок с такой системой голосования.

+0

+1 - отличная статья, спасибо. – Drew

1

Каждый пользователь вносит (weight)*(rating) в общий рейтинг, поэтому числитель представляет собой сумму этого для всех пользователей.

Знаменатель - максимально возможный балл, для каждого пользователя это (weight)*5. Таким образом, знаменатель является суммой этого для всех пользователей.

Затем вычисляется оценка, как:

sum{ (user i's weight) * (user i's rating) }/sum{ (user i's weight) * 5 } 

Обратите внимание, однако, это дает оценку в диапазоне 0-1, если вы хотите, чтобы счет в диапазоне 0-5 можно нормализовать с помощью 5, это уменьшает коэффициент 5 в знаменателе.

Предположит, у вас есть два массива, один из оценок (The я -й пункт соответствует рейтингу я -го пользователя) $ratings и один из грузил (я -й элемент соответствует я уровень RPG -го пользователя) $weights вы можете вычислить это как:

$numer = 0; 
$denom = 0; 
for($i = 0; $i < count($ratings); $i++){ 
    $numer = $weights[$i]*$ratings[$i]; 
    $denom = $weights[$i]; 
} 
$avg = $numer/$denom; 
+1

Cheers Mark для быстрого ответа, однако я немного запутался в том, как интегрировать ваш метод, можете ли вы активировать то, что «$ rated» и «$ weights» (я понимаю их массивы, но не уверен, какие данные они хранят), пожалуйста? – newbtophp

+0

@newb: ok - обновлено. –

0

Попробуйте сделать что-то вроде этого ... А уровень 1 пользователей голосования считается, что 1 голос, в то время как уровень 8 пользователей голосовать считается, что 8 голосов:

$thisvote = $level * $vote; 
//a user with a level 5, and a vote of 5...this is 25 
$total = ($total + $thisvote)/$level + 1; 
//if total was 4, 25+4 = 29, 29/6 = 4.83 

Это проще, чем использование массивов, если вы не фактически сохраняя каждого пользователя, проголосовавшего и за то, что они голосовали.