PHP интенсивность голосования / сила?
Ну, я думаю о добавлении функции оценки в мое приложение, где участники могут голосовать между 1-5 (это $rating
), и я отображаю средний балл как $score = $number_of_voters / $rating
, куда $number_of_voters
общее количество членов, проголосовавших по этому конкретному пункту, и $rating
это общий рейтинг для этого конкретного элемента.
Таким образом, $score
не может быть выше 5 (что вне его).
Однако я думаю об интеграции интенсивности / силы голосования в соответствии с уровнем РПГ пользователей (который является числом от 1 до 8, который может постепенно увеличиваться - который назначил каждый участник), так что если, например, они проголосовали, и их уровень РПГ был 1 средняя оценка не будет слишком отличаться от предыдущей (не повлияет ли она на нее слишком сильно), однако, если это будет что-то вроде 8, то это повлияет на нее больше? (слишком резюмируйте, что их уровень RPG будет рассмотрен внутри страны при голосовании).
Но не уверен, как действовать (как интегрировать / реализовать), не влияя на первоначальную спецификацию (т.е. я не хочу, чтобы оценка была выше 5 (хочу, чтобы она была $score <= 5)).
3 ответа
Чтобы ответить на ваш ближайший вопрос, вы можете умножить на дробный вес 0-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 в знаменателе.
Предположим, у вас есть два массива, один из рейтингов (i-й элемент соответствует рейтингу i-го пользователя) $ratings
и один из весов (i-й элемент соответствует уровню RPG i-го пользователя) $weights
Вы можете вычислить это как:
$numer = 0;
$denom = 0;
for($i = 0; $i < count($ratings); $i++){
$numer = $weights[$i]*$ratings[$i];
$denom = $weights[$i];
}
$avg = $numer / $denom;
Попробуйте сделать что-то вроде этого... Голосование пользователей уровня 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
Это проще, чем использовать массивы, если вы на самом деле не сохраняете каждого проголосовавшего пользователя и его голос.