Gå til innhold

Hvordan gjenta (loope) et script?


Anbefalte innlegg

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
Videoannonse
Annonse
Gjest Slettet-df17e
$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

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 av ????????
Lenke til kommentar

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...