plaats in klasement door php laten berekenen ?

Status
Niet open voor verdere reacties.

jeroenth

Gebruiker
Lid geworden
19 sep 2009
Berichten
16
Hallo allemaal.
Ik heb een site waar een uitslagen van een pokercompetitie op staan.
De gegevens worden uit een database gehaald ik had via een tellertje een nummering erbij.
Echter als er twee mensen gelijk eindigen klopt het niet meer :eek:

Het Script
PHP:
$verbinding = mysql_connect ($host, $gebruiker, $wachtwoord);
$opdracht = "SELECT naam, count(id) AS gespeeld, SUM(punten) AS totaal_punten, ROUND(AVG(punten),0) AS gem_punten FROM $tabelnaam WHERE ($periode)   GROUP BY naam HAVING gespeeld >= $minimaal
ORDER BY gem_punten DESC ";
$resultaat = mysql_db_query ($dbnaam, $opdracht, $verbinding);

//maak een tabel
print ("<TABLE BORDER=1 WIDTH=\"75%\" CELLSPACING=2 CELLPADDING=2 ALIGN=CENTER>\n");
print ("<TR ALIGN=CENTER VALIGN=TOP>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Plaats</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Naam</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Aantal gespeeld</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Totaal punten</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Gem punten</TD>\n");
print ("</TR>\n");

//Schrijf resultaat naar het scherm
while ($rij = mysql_fetch_array ($resultaat) ) {
print ("<TR ALIGN=CENTER VALIGN=TOP>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$i</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$rij[naam]</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$rij[gespeeld]</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$rij[totaal_punten]</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$rij[gem_punten]</TD>\n");
print ("</TR>\n");
$i++;
}
mysql_close ($verbinding);
print ("</TABLE>\n");
?>

Wie kan me helpen om met php de plaats te laten berekenen zodat ook gelijkstand goed wordt getoond?
 
Laatst bewerkt door een moderator:
Define 'Goed getoond'?

Hoe wil je het weergeven, en wat wordt er nu weergegeven?
 
Nu telt het script van 1 op naar beneden.
dus 1 plaats
2 plaats enz

Maar als er mensen zijn die evenveel punten hebben en dus een gedeelde 2 plaats b.v. telt mijn script gewoon door.

eigenlijk zou ik &rij[gem_punten] moeten controleren met de voorgaande en de teller pas verhogen als die waarde lager is dan de vorige.

ik hoop dat dit iets duidelijker is:shocked:
 
Dat laatste is precies wat je wil doen.

Hou bij wat de laatste score was, hou bij op welke rang je zit, hoeveel rangen hetzelfde waren, en gebruik die informatie om te berekenen welke rang je moet tonen.

Probeer het eens, en kijk hoe ver je komt... als het niet lukt helpen we je verder ;)
 
Dat zou moeten lukken en ik zoek het ook graag zelf uit anders leer ik niks :D

Maar kun je een tip geven hoe ik de waarden die ik nodig heb uit de array in een string kan zetten om de benodigde berekeningen te doen ?
 
Je hebt ze niet allemaal nodig; alleen de relevante.

Wat je moet weten: de laatste score (begin met een heel hoog getal hier) de huidige rang (begin op 1) en het aantal gelijke rangen (begin met 0)

Vervolgens haal je een nieuwe rij op, vergelijk je de nieuwe score die je krijgt met de laatste score die je opgeslagen hebt.
Als de score gelijk is, dan hoog je het aantal gelijke rangen op met 1.
Als de score lager is, dan hoog je de huidige rang op met het aantal rangen dat je hebt overgeslagen + 1.
Vervolgens vervang je de huidige laatste score, met de nieuwe score die je net opgehaald hebt.

Daarna echo je de huidige rang uit de variabele.

Helpt dat genoeg? :)
 
Bedankt voor het zetje in de goede richting Frats.

Gelijke stand word nu keurig netjes getoond.
Het stukje om na b.v. een gedeelde 2e plaats de volgende 4e te maken heb ik er niet in verwerkt daar is niet echt behoefte aan op onze site.

Ik heb het zo opgelost:
Code:
<?php
include ("dbconfig.php");
$plaats = 1;
$periode	="datum >='2009-06-00' AND datum <= '2009-09-31'";


$verbinding = mysql_connect ($host, $gebruiker, $wachtwoord);
$opdracht = "SELECT naam, count(id) AS gespeeld, SUM(punten) AS totaal_punten, ROUND(AVG(punten),0) AS gem_punten FROM $tabelnaam 
WHERE ($periode)  
GROUP BY naam HAVING gespeeld >= 3 ORDER BY gem_punten DESC";
$resultaat = mysql_db_query ($dbnaam, $opdracht, $verbinding);

//maak een tabel
print ("<TABLE BORDER=1 WIDTH=\"75%\" CELLSPACING=2 CELLPADDING=2 ALIGN=CENTER>\n");
print ("<TR ALIGN=CENTER VALIGN=TOP>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Plaats</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Naam</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Aantal gespeeld</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Totaal punten</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>Gem punten</TD>\n");
print ("</TR>\n");

//Schrijf resultaat naar het scherm
while ($rij = mysql_fetch_array ($resultaat) ) {
if ($gem_punten == $rij[gem_punten]) {
	$plaats -- ;
	 }
print ("<TR ALIGN=CENTER VALIGN=TOP>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$plaats</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$rij[naam]</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$rij[gespeeld]</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$rij[totaal_punten]</TD>\n");
print ("<TD ALIGN=CENTER VALIGN=TOP>$rij[gem_punten]</TD>\n");
print ("</TR>\n");
$plaats ++;
$gem_punten = $rij["gem_punten"] ;
}
mysql_close ($verbinding);
print ("</TABLE>\n");
?>
 
Graag gedaan en mooi dat het opgelost is ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan