2011-01-12 6 views
2

Eh bien, je pense à ajouter une fonction de notation à mon application où les membres peuvent voter entre 1-5 (c'est le $rating), et j'affiche le score moyen comme $score = $number_of_voters/$rating. Où $number_of_voters est le nombre total de membres ayant votés pour cet article spécifique, et $rating est la note totale attribuée à cet article spécifique.PHP intensité de vote/force?

De cette façon, le $score ne peut pas être supérieur à 5 (ce qui est hors de). Cependant, je pense à intégrer une intensité/force de vote selon le niveau RPG des utilisateurs (qui est un nombre compris entre 1 et 8 qui peut augmenter graduellement - que chaque membre a assigné), donc si par exemple ils ont voté et leur niveau de RPG était de 1 le score moyen ne serait pas trop différent du précédent (ne l'affecterait pas trop) mais si c'était quelque chose comme 8 alors cela l'affecterait plus? (résumer aussi leur niveau RPG serait considéré à l'interne lors du vote).

Mais je ne sais pas comment procéder (comment intégrer/implémenter) sans affecter la spécification initiale (ie je ne veux pas que le score soit supérieur à 5 (veux qu'il soit $ score < = 5)).

+0

$ score = $ nombre_des_votre/$ estimation? Qu'est-ce que ça veut dire...voulez-vous dire $ score = $ number_of_voters (rating = 1)/1 + $ number_of_voters (rating = 2)/2 etc. – Jason

+0

@Jason J'ai édité mon questionnaire initial/poste avec plus d'informations - s'il vous plaît le voir :) – newbtophp

Répondre

2

Pour répondre à votre question immédiate, vous pouvez multiplier par un poids fractionné 0-1. Si vous avez différents niveaux, vous pouvez obtenir ce poids en divisant le niveau de l'utilisateur par le niveau maximum.

Mais avant de commencer le codage, vous devriez lire How Not To Sort By Average Rating afin d'éviter les pièges courants avec ce type de système de vote.

+0

+1 - super article, merci. – Drew

1

Chaque utilisateur contribue (weight)*(rating) à la note globale, de sorte que le numérateur est la somme de tous les utilisateurs. Le dénominateur est le score maximal possible, pour chaque utilisateur (weight)*5. Ainsi, le dénominateur est la somme de ceci sur tous les utilisateurs.

Calculons alors le score comme:

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

avis cependant, cela vous donne un score de l'ordre de 0-1, si vous voulez que le score dans la gamme 0-5 vous pouvez normaliser par 5, cela supprime le facteur 5 dans le dénominateur.

Supposons que vous avait deux tableaux, l'une des notes (le i point -ème correspond à la note du i utilisateur -ème) $ratings et l'un des poids (le i point -ème correspond à la i niveau de RPG de l'utilisateur -ème) $weights vous pouvez calculer ce que:

$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 pour la réponse rapide, mais je suis un peu confus sur la façon d'intégrer votre méthode, pouvez-vous élaborer sur ce que «$ notes» est et «$ poids» est (je comprends leurs tableaux, mais je ne sais pas sur quelles données ils tiennent), S'il vous plaît? – newbtophp

+0

@newb: ok - mis à jour. –

0

Essayez de faire quelque chose comme ça ... Un niveau 1 utilisateurs votent compte comme 1 vote, tandis qu'un niveau 8 utilisateurs vote compte que 8 votes:

$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 

Il est plus facile que d'utiliser des tableaux si vous n'êtes pas stockant réellement chaque utilisateur qui a voté et quel était leur vote.

Questions connexes