PHP投票强度/力量?

时间:2011-01-12 02:32:17

标签: php rating drupal-fivestar

好吧我想在我的应用程序中添加一个评级功能,成员可以在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>

3 个答案:

答案 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

如果您实际上并未存储每个投票的用户以及他们的投票结果,那么这比使用数组更容易。