AndyPhil Skrevet 16. november 2005 Del Skrevet 16. november 2005 Hei! holder på å lage en highscore liste i php. Bruker flatfile til å lagre scorene... Her er koden som viser scorene i en tabell: <table width="700" border="1" cellpadding="0" cellspacing="0" bordercolor="1" bgcolor="#999999"> <tr> <td><div align="center"><strong>Poeng</strong></div></td> <td><div align="center"><strong>Level</strong></div></td> <td><div align="center"><strong>Navn</strong></div></td> </tr> <?php $lines = file("scoredata.php"); foreach($lines as $single_line){ $line_arr = explode("|", $single_line); $lin[$line_arr[0]] = $line_arr[1]; $line_header[$line_arr[0]]=$line_arr[3]; } $score = $line_arr[1]; $level = $line_arr[2]; $name = $line_arr[3]; print (" <tr bgcolor='#CCCCCC'> <td><div align='center'>$score</div></td> <td><div align='center'>$level</div></td> <td><div align='center'>$name</div></td> </tr>"); ?> </table> Jeg trenger å gjenta (loope) siste delen (den under) x antall ganger til alle navnene er kommet med på lista eventuelt de 5 beste.. print (" <tr bgcolor='#CCCCCC'> <td><div align='center'>$score</div></td> <td><div align='center'>$level</div></td> <td><div align='center'>$name</div></td> </tr>"); NBNB! Hvis noen vet hvordan man kan soltere etter poeng så den beste kommer øverst setter jeg pris på det også. Sourcefila (scoredata.php) ser slik ut: |Poeng/Score|Level|Navn/Name||Poeng/Score|Level|Navn/Name| osv.. Setter pris på om noen hjelper meg er veldig n00b i php ! Lenke til kommentar
kakkle Skrevet 16. november 2005 Del Skrevet 16. november 2005 Merkelig hvor mange som plutselig skal ha highscore Det har vært minst 2 andre poster om dette de ssite dagene: Du kan se på: https://www.diskusjon.no/index.php?showtopic=497355 og for sortering : https://www.diskusjon.no/index.php?showtopic=114941 Du får kanskje svar på sprøsmålene dine der ? Lenke til kommentar
Gjest Slettet-df17e Skrevet 16. november 2005 Del Skrevet 16. november 2005 $i = 1; $x = 5; while ($i <= $x) { print (" <tr bgcolor='#CCCCCC'> <td><div align='center'>$score</div></td> <td><div align='center'>$level</div></td> <td><div align='center'>$name</div></td> </tr>"); $++; } Lenke til kommentar
???????? Skrevet 16. november 2005 Del Skrevet 16. november 2005 (endret) Hei AndyPhil, dette er ikke noe problem å løse. Det føreste du må gjøre er å hente innholdet i filen til en variabel, det gjør du med file_get_contents(): $file = file_get_contents("navn på fil.txt"); Så skal du dele opp statistikken, det kan du gjøre enklest via explode dersom du ikke kan regex - men vi velger regex siden det gir et kortere script. preg_match_all("/\|(.*?)\|(.*?)\|(.*?)\|/", $file, $treff); Så kan vi gi variabelene et litt enklere navn, for nå må du bruke $treff[0][0] osv. for å vise info: $poeng = $treff[1]; $level = $treff[2]; $navn = $treff[3]; Så sa du at du ville sortere disse slik at kun de fem beste vises, da bruker vi array_multisort(): array_multisort($poeng, SORT_DESC, SORT_NUMERIC, $navn, $level); Der ser du at variabelene våre er, samt at vi pressiserer at det skal sorteres synkende og det er tall det er snakk om. Ellers ville 11 komme før 2, siden den tar utgangspunktet i 1 som laves (24 ville komme før 4 osv.) Så til slutt har vi funksjonen for å skrive ut resultatet: for ( $i = 0; $i < 5; $i++) { echo "Navn: {$navn[$i]}, Poeng: {$poeng[$i]}, Level: {$level[$i]} <br />\n"; } Dersom du ønsker en top 10 liste så bytter du bare ut $i < 5 til $i < 10. Da skal scriptet ditt se slik ut: <?php $file = file_get_contents("navn på fil.txt"); preg_match_all("/\|(.*?)\|(.*?)\|(.*?)\|/", $file, $treff); $poeng = $treff[1]; $level = $treff[2]; $navn = $treff[3]; array_multisort($poeng, SORT_DESC, SORT_NUMERIC, $navn, $level); for ( $i = 0; $i < 5; $i++) { echo "Navn: {$navn[$i]}, Poeng: {$poeng[$i]}, Level: {$level[$i]} <br />\n"; } ?> Endret 16. november 2005 av ???????? Lenke til kommentar
saivert Skrevet 16. november 2005 Del Skrevet 16. november 2005 Hei ???. Jeg bruker den regex-en din i min egen hiscore classe. Her er et utdrag: class ScoreBoard { var $filename; var $data=array(); // Constructor function ScoreBoard($filename) { $this->filename = $filename; if (file_exists($this->filename)) { $lines = @file($this->filename); /* Takk til ???? (forum post: http://www.diskusjon.no/index.php?showtopic=497852#) for dette tipset. */ preg_match_all("/\|(.*?)\|(.*?)\|/", $file, $treff); $this->data = $treff; } } Det jeg vil gjøre er å fylle array $data med navn|poeng par. Slik at hvis man har datafilen: nicolai|3|per|20|hans|34 så vil $data[0][0] == 'nicolai' og $data[0][1] == '3' samme som at $data[1][0] == 'per' og $data[1][1] == '20' sånn at strukturen i datafilen egentlig er navn|poeng|..navn|poeng| Men er det kansje bedre med: navn|poeng\nnavn|poeng.. En ting til: Jeg skal også bruke htmlentities på både navn og poeng feltene, så hvordan gjør jeg det enkelt i regex-en? Må man bruke regex for å utføre PHP kode? Da fungerer det kansje bare med ereg ?? Lenke til kommentar
???????? Skrevet 16. november 2005 Del Skrevet 16. november 2005 Hei igjen. Dersom du endrer formatet til navn|poeng|navn|poeng kan du skrive det om slik: $file = "navn|poeng|navn2|poeng2|navn3|poeng3|navn4|poeng4"; preg_match_all("/(.*?)\|(.*?)\|/", $file, $treff); $data[0] = $treff[1]; $data[1] = $treff[2]; Merk: du kan endre variabelen $treff til $data i preg_match_all(), men da vil $data[1] (navn) tilsvare det du ønsket $data[0] som, og $data[2] (poeng) vil være slik du ønsket data[1]. Videre er jeg ikke helt sikker på hva du mener med htmlentities på feltene navn og poeng. Hva ønsker du der å gjøre i en regex? Lenke til kommentar
AndyPhil Skrevet 17. november 2005 Forfatter Del Skrevet 17. november 2005 Tusen takk for kjappe og gode svar . Jeg har ikke hatt til til å sette meg ned med det enda men jeg skal nok få det til. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå