login  Naam:   Wachtwoord: 
Registreer je!
 Forum

scores sorteren

Offline Sander1993 - 30/12/2008 19:37 (laatste wijziging 30/12/2008 19:39)
Avatar van Sander1993PHP interesse misschien klinkt de vraag dom maar hoe sorteer ik de scores op hoogte, ik dacht dan aan sort();, maar als ik die voor de highscore doe blijven de namen van de spelers staan, dus komen ze niet bij de goede score te staan, dit is mijn script:
Plaatscode: 64377

edit: plaatscode.be heeft iets gedaan met de backslashes waardoor de highlight niet goed loopt.

26 antwoorden

Gesponsorde links
Offline timmie_loots - 30/12/2008 19:42 (laatste wijziging 30/12/2008 19:49)
Avatar van timmie_loots PHP gevorderde ksort() gebruiken, dan blijft de key bij de score. Of je er zo wat mee kan blijft giswerk, misschien even de array posten die je krijgt.

EDIT:
Props voor de totaal nutteloze vorm van hungarian notation die je gebruikt trouwens. Je zou dit artikel eens moeten lezen.
Offline Sander1993 - 30/12/2008 19:48
Avatar van Sander1993 PHP interesse als ik ksort invul wordt de kolom voor de scores leeg en als ik ksort voor de gehele array zet wordt de spelerskolom leeg
Offline timmie_loots - 30/12/2008 19:50
Avatar van timmie_loots PHP gevorderde Wat voor arrays krijg je nou! Ik kan wel gaan gokken, maar daar hebben we beiden helemaal niets aan.
Offline Sander1993 - 30/12/2008 19:53 (laatste wijziging 30/12/2008 20:07)
Avatar van Sander1993 PHP interesse ik denk dat het het probleem is waar ik ksort() neerzet, btw, ik denk dat ik krsort moet gebruiken want het gaat van de hoogste score tot de laagste. dit is het voorbeeld: http://aardappelhoofd.nl/cod.php, misschien als je het voorbeeld ziet begrijp je beter wat ik bedoel.

edit: wat is er zo nutteloos aan mn hongaarse noteermethode
Offline timmie_loots - 30/12/2008 20:08 (laatste wijziging 30/12/2008 20:12)
Avatar van timmie_loots PHP gevorderde Ik ben benieuwd waarop jij überhaupt een sort hebt uitgevoerd. Dat is namelijk niet te doen zo. Je moet de gegevens per speler eerst in een array stoppen alvorens ze te printen, dan kun je op die array sorten.

Je doet sowieso een paar dingen in je code waar ik eigenlijk wel een beetje om moet lachen. Deze bijvoorbeeld:

  1. $players = implode("\n", $aArray);
  2. $sPlayers = explode("\n", $players);


Je krijgt nu een $sPlayers die precies hetzelfde is als $players. Bovendien geef je met je brakke hungarian notation aan dat het een string betreft, maar dat is niet eens zo.

Een andere is:

  1. $aArray = array_diff($aArray, array($aArray[0]));


Nog nooit van array_shift gehoord?

En als laatste deze:

  1. list($mod, $players) = explode("\r\n", $modandplayers);
  2. $aArray = explode("\n", $modandplayers);


Wilde het met \r\n niet ofzo, en dacht je het toen zo te doen? Als het eerste gewoon werkt heb je twee keer hetzelfde gedaan, hetzij je één keer nog een carriage return over blijft houden. Het leukste is nog dat je later $mod gaat overschrijven met $aArray[0], die twee zijn namelijk waarschijnlijk hetzelfde.

EDIT:
Citaat:
edit: wat is er zo nutteloos aan mn hongaarse noteermethode


Lees het artikel wat ik gaf eens. De prefix moet het soort aangeven van de waarde in de variabele, niet het type.
Offline Sander1993 - 30/12/2008 20:11 (laatste wijziging 30/12/2008 20:20)
Avatar van Sander1993 PHP interesse alle code die je nu opnoemt komen uit een andere topic en is heb ik dus niet geschreven en is dus ook niet mijn hongaarse notatie dus lach niet om mijn code, en idd ik had nog nooit van array_shift gehoord. en je hoeft je echt niet zo op een beginner los te laten. en plz beperk je ff tot het sorteren van de scores.

edit : ok, dan gebruik ik geen hongaarse notatie meer, sterker zoals ik al zei was het niet mijn notatie, kunnen we ons dan ff beperken tot het onderwerp 'scores op hoogte sorteren' i.p.v. hongaarse notatie
Offline timmie_loots - 30/12/2008 20:18
Avatar van timmie_loots PHP gevorderde
Sander1993 schreef:
alle code die je nu opnoemt komen uit een andere topic en is heb ik dus niet geschreven en is dus ook niet mijn hongaarse notatie dus lach niet om mijn code, en idd ik had nog nooit van array_shift gehoord. en je hoeft je echt niet zo op een beginner los te laten. en plz beperk je ff tot het sorteren van de scores.


Dat het je eigen code is, maakt geen ruk uit voor de fouten die erin zitten. Als je code krijgt van een ander is het juist de bedoeling dat je die code goed gaat bestuderen om te weten te komen wat die code precies doet. Wat betreft de hungarian notation: Dat was niet om je af te kraken hoor.

Het sorteren van de scores is niet moeilijk, je moet de gegevens die je uit de $sPlayerExploded array haalt eerst even in een aparte array zetten, zonder ze te printen. Je kunt ze dan sorteren met k(r)sort().
Offline Sander1993 - 30/12/2008 20:26
Avatar van Sander1993 PHP interesse kijk het zit zo, met sommige dingen in php ben ik niet zo goed, zoals sorteren, nu heb ik een aparte arary gepakt scores gesorteerd, maar hij geeft geen output, dit is de code (de fout zou waarschijnlijk echt vet dom zijn)
Plaatscode: 64383
Offline timmie_loots - 30/12/2008 20:57
Avatar van timmie_loots PHP gevorderde
Sander1993 schreef:
kijk het zit zo, met sommige dingen in php ben ik niet zo goed, zoals sorteren, nu heb ik een aparte arary gepakt scores gesorteerd, maar hij geeft geen output, dit is de code (de fout zou waarschijnlijk echt vet dom zijn)
Plaatscode: 64383


Er is niets mis met fouten maken hoor, ik wilde ook de indruk niet geven dat ik je af wilde kraken (het lachen was met de beste bedoelingen hoor, ik vond het gewoon komisch).

Om even op de code terug te komen, je gaat hier de fout in:

  1. $apartearray = $sPlayerExploded[0];


Wat je hier doet, is een enkele score in een variabele zetten. Die variabele is op dat moment niet eens een array, dus sorteren gaat inderdaad niet werken.

Wat ik bedoel, is dat je buiten de for-loop een aantal arrays definiëert. In de for-loop zet je dan de scores en de namen etc. in die arrays. Je kunt dan de score-array krsorten, zodat je met de keys van de score array de andere gegevens op kunt vragen.

Je wilt dus zoiets krijgen:

  1. <?php
  2.  
  3. $namen = array(0 => 'Pietje', 1 => 'Henk', 2 => 'Jantje');
  4. $scores = array(0 => 13, 1 => 24, 2 => 7);
  5.  
  6. krsort($scores);
  7.  
  8. foreach ($scores as $key => $score) {
  9.  
  10. echo $namen[$key] . " heeft een score van " . $score . "<br>";
  11.  
  12. }
  13.  
  14. ?>
Offline Sander1993 - 30/12/2008 21:48
Avatar van Sander1993 PHP interesse ik heb nu gedaan wat je zei:
Plaatscode: 64387
maar de tabel blijft leeg.
Offline Koen - 30/12/2008 22:00
Avatar van Koen PHP expert
timmie_loots schreef:
Nog nooit van array_shift gehoord?


Dat was dus de functie die ik zocht!
Was hem aan het helpen met z'n scripts maar ik kon niet op de functie komen, vandaar 
Offline timmie_loots - 30/12/2008 22:31 (laatste wijziging 30/12/2008 22:36)
Avatar van timmie_loots PHP gevorderde
Sander1993 schreef:
ik heb nu gedaan wat je zei:
Plaatscode: 64387
maar de tabel blijft leeg.


Hmm, niet helemaal. Je moet $namen en $scores al definiëren voordat je aan de for-loop begint. Bovendien moet je in de for-loop niet al gaan printen, want pas als die af is ga je sorteren. Je moet het zo zien:

1) $namen en $rows definiëren
2) In de for-loop die je nu hebt doe je $namen[] = $sPlayersExploded[1]; en $scores[] = $sPlayersExploded[0];
3) Na de for-loop doe je krsort($scores);
4) Nu gebruik je de for-each om de boel te printen

Probeer zoiets eens in elkaar te zetten.

EDIT:
Om van dit probleem te leren is het handig om eens te kijken wat er precies gebeurd vanaf regel 43. Ga nou eens voor jezelf per regel na wat er precies gedaan wordt. Dan zie je de fout misschien ook sneller 
Offline Sander1993 - 30/12/2008 22:40 (laatste wijziging 30/12/2008 22:43)
Avatar van Sander1993 PHP interesse de foreach loop moet toch in de for loop?

edit: ik kom dr niet helemaal uit, dit is mn script, kun je zeggen wat daar dan fout aan is.
  1. //rest erboven
  2. for($i=0;$i<$iPlayers;$i++) {
  3. $sPlayerExploded = explode(" ",$sPlayers[$i]);
  4. $sPlayerName = explode('"',$sPlayerExploded[2]);
  5. $rank = $i+1;
  6. $namen = $sPlayerName[1];
  7. $scores = $sPlayerExploded[0];
  8. foreach ($scores as $key => $score) {
  9. krsort($scores);
  10.  
  11. echo "<tr><td>".$rank."</td><td>".$namen[$key]."</td><td>".$score."</td><td>".$sPlayerExploded[1]."</td></tr>\n";
  12. }
  13. }
  14. echo "</table>";
  15. //rest hieronder
Offline timmie_loots - 30/12/2008 23:03 (laatste wijziging 30/12/2008 23:03)
Avatar van timmie_loots PHP gevorderde De foreach-loop moet dus niet in de for-loop 

Hij moet ná de for-loop komen. Zodat je in de for-loop de namen en de scores op kunt slaan in de $namen en $scores array. Kijk, zo:

  1. // De namen- en score-array maken
  2. $namen = array();
  3. $scores = array();
  4.  
  5. // Loopen
  6. for ($i = 0; $i < $iPlayers; $i++) {
  7.  
  8. // De gegevens van de huidige speler exploden
  9. $playerData = explode(" ", $sPlayers[$i]);
  10.  
  11. // De naam exploden, dat moet blijkbaar
  12. $naamData = explode('"', $playerData[2]);
  13.  
  14. // De naam aan de namen-array toevoegen
  15. $namen[] = $naamData[1];
  16.  
  17. // De score aan de score-array toevoegen
  18. $scores[] = $playerData[0];
  19.  
  20. }
  21.  
  22. // Nu hebben we twee arrays, namelijk $namen en $scores die we kunnen doorlopen
  23. // Maar eerst gaan we sorteren op de scores
  24. krsort($scores);
  25.  
  26. // We gaan ook nog een rank bijhouden
  27. $rank = 1;
  28.  
  29. // Doorlopen en echo'en
  30. foreach ($scores as $key => $score) {
  31.  
  32. echo "<tr><td>" . $rank . "</td><td>" . $namen[$key] . "</td><td>" . $score . "</td></tr>";
  33.  
  34. }


Ik heb nu de ping achterwege gelaten, maar daar zou je zelf uit moeten kunnen komen, je moet hem namelijk alleen maar toevoegen aan het begin, zorgen dat er gegevens ingestopt worden in de for-loop (dat ziet er hetzelfde uit als die van $namen en $scores) en printen in de foreach-loop.
Offline Sander1993 - 31/12/2008 11:01
Avatar van Sander1993 PHP interesse nu weergeeft hij wel de namen en de scores etc... maar hij sorteert de scores nog steeds niet.
code: Plaatscode: 64421
link waar je ku...t sorteert
Offline timmie_loots - 31/12/2008 11:05
Avatar van timmie_loots PHP gevorderde Maak van $scores[] = $playerData[0]; eens $scores[] = (int)$playerData[0];
Offline Sander1993 - 31/12/2008 11:21 (laatste wijziging 31/12/2008 15:15)
Avatar van Sander1993 PHP interesse nope werkt nog steeds niet
als ik krsort omwissel met ksort draait alles om, dus er wordt wel op een er van een manier gesorteerd
Offline timmie_loots - 31/12/2008 16:00
Avatar van timmie_loots PHP gevorderde Hmm, en wat als je van dit:

  1. echo "<tr><td>" . $rank . "</td><td>" . $namen[$key] . "</td><td>" . $score . "</td></tr>";


eens dit maakt:

  1. echo "<tr><td>" . $rank . "</td><td>" . $namen[$key] . "</td><td>" . $scores[$key] . "</td></tr>";
Offline Sander1993 - 31/12/2008 16:03
Avatar van Sander1993 PHP interesse nee, dat werkt ook niet  
Offline timmie_loots - 31/12/2008 16:27
Avatar van timmie_loots PHP gevorderde Zet dit eens voor én na de krsort():

  1. echo "<pre>" . print_r($scores, 1) . "</pre>";


En laat dan eens zien wat je krijgt.
Offline Sander1993 - 31/12/2008 16:39 (laatste wijziging 31/12/2008 16:39)
Avatar van Sander1993 PHP interesse voor de krsort();

  1. (
  2. [0] => 10055
  3. [1] => 22099
  4. [2] => 24116
  5. [3] => 46217
  6. [4] => 12054
  7. [5] => 26133
  8. [6] => 22113
  9. [7] => 16080
  10. [8] => 30135
  11. [9] => 8044
  12. [10] => 2
  13. [11] => 8036
  14. [12] => 10053
  15. [13] => 2009
  16. [14] => 10045
  17. [15] => 6041
  18. [16] => 26141
  19. [17] => 16072
  20. [18] => 26123
  21. [19] => 0
  22. [20] => 6027
  23. )

en erna:
  1. (
  2. [0] => 10055
  3. [1] => 22099
  4. [2] => 24116
  5. [3] => 46217
  6. [4] => 12054
  7. [5] => 26133
  8. [6] => 22113
  9. [7] => 16080
  10. [8] => 30135
  11. [9] => 8044
  12. [10] => 2
  13. [11] => 8036
  14. [12] => 10053
  15. [13] => 2009
  16. [14] => 10045
  17. [15] => 6041
  18. [16] => 26141
  19. [17] => 16072
  20. [18] => 26123
  21. [19] => 0
  22. [20] => 6027
  23. )

dus ze zijn nog hetzelfde gebleven
Offline timmie_loots - 31/12/2008 16:48
Avatar van timmie_loots PHP gevorderde En als je van

  1. krsort($scores);
dit maakt:
  1. krsort($scores, SORT_NUMERIC);
Offline Sander1993 - 31/12/2008 17:09
Avatar van Sander1993 PHP interesse nope, geeft nog steeds dezelfde output
Offline Thomas - 01/01/2009 01:16
Avatar van Thomas Moderator Het (omgekeerd) sorteren op key lijkt me niet zo zinnig - het gaat om de values (de scores), ook is het verband met een speler weg?

Lijkt me een stuk handiger als je aangeeft wat je invoer + structuur van deze invoer (A) is, en wat je hier van wilt maken (B).

Anders is het vrij onmogelijk voor iemand om aan te geven hoe je van (A) naar (B) komt.
Offline timmie_loots - 01/01/2009 04:08 (laatste wijziging 01/01/2009 04:11)
Avatar van timmie_loots PHP gevorderde
FangorN schreef:
Het (omgekeerd) sorteren op key lijkt me niet zo zinnig - het gaat om de values (de scores), ook is het verband met een speler weg?

Lijkt me een stuk handiger als je aangeeft wat je invoer + structuur van deze invoer (A) is, en wat je hier van wilt maken (B).

Anders is het vrij onmogelijk voor iemand om aan te geven hoe je van (A) naar (B) komt.


Blijkbaar zat ik verkeerd, ik was er van overtuigd dat krsort sorteerde met behoud van keys, niet op de keys. Dan moet er gewoon gebruik gemaakt worden van arsort.

Mijn excuses.

EDIT:
Ah, ik ben natuurlijk in de war geweest met arsort! Ik dacht aan de k van key zodat die behouden bleef, maar het gaat om de a van associatief om de key/value relatie te behouden.
Offline Martijn - 01/01/2009 13:36
Avatar van Martijn Crew PHP ik denk dat de keys hier hetzelfde blijven ookal sort je de waardes, omdat je nergens eenv aste key waarde hebt gegeven. Die nummertjes ervoor zijn voor een user fijn, maar volgens mij zit dr geen link tussen de key en value. Mssn moet je hardcoded nummeren, mssn dat t dan wel lukt
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.322s