好吧我想在我的应用程序中添加一个评级功能,成员可以在1-5之间投票(这是$rating
),并显示平均分数,如$score = $number_of_voters / $rating
。其中$number_of_voters
是针对该特定项目投票的成员总数,$rating
是该特定项目的总评分。
那样$score
不能高于5(它的出来)。
然而,我正在考虑根据用户RPG级别(这是1-8之间的数字逐渐增加 - 每个成员分配的数字)来整合投票强度/力量,所以如果他们投票和他们的RPG等级为1,平均分数与之前的分数差别不大(不会影响太大)但是如果它是8那么它会影响更多吗? (总结一下他们的RPG等级在投票时会在内部考虑)。
但不确定如何继续(如何整合/实施)而不影响初始规范(即我不希望分数高于5(希望它是$ score&lt; = 5))。< / p>
答案 0 :(得分:2)
要解决您的直接问题,您可以乘以0-1的分数权重。如果你有不同的等级,你可以通过将用户的等级除以最高等级来获得这个权重。
但是在你开始编码之前,你应该阅读How Not To Sort By Average Rating,这样你就可以避免使用这种投票系统的一些常见陷阱。
答案 1 :(得分: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 -th项对应 i -th用户的评级)$ratings
和一个权重( i -th项对应于 i -th用户的RPG级别)$weights
您可以将其计算为:
$numer = 0;
$denom = 0;
for($i = 0; $i < count($ratings); $i++){
$numer = $weights[$i]*$ratings[$i];
$denom = $weights[$i];
}
$avg = $numer / $denom;
答案 2 :(得分: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
如果您实际上并未存储每个投票的用户以及他们的投票结果,那么这比使用数组更容易。