Highscorelisten-Eintrag via php-script (special thanxs to BrainBug)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Highscorelisten-Eintrag via php-script (special thanxs to BrainBug)

    Hi Leute!

    Hab ein kleines Problem mit meinem PHP-Highscorelisteneintrag.
    Das Script schreibt den neuen Winner in eine Data.txt rein die folgendermaßen aussieht:

    Hoschi;700
    Jan;400
    Enno;170
    hetfield;998

    Erlaubt werden max. 10 Einträge. D.h. sind 10 Einträge in der Data.txt drinnen, dann löscht das Script den kleinsten Eintag und der neue wird stattdessen hinzugefügt. Sind weniger als 10 Einträge vorhanden, dann soll dieser nur hinzugefügt werden. Das funkt alles.
    Das Problem:
    Wenn weniger als 10 Einträge drinnen sind und der neue Eintrag kleiner ist als der kleinste Wert der vorhanden ist (in diesem Fall Enno;170) dann schreibt mir php den neuen Eintrag nicht in die Data.txt hinein. (Anmerkung: Ist der Wert größer als 170 dann funtzts komischerweise)
    Hier der Code (ich glaube, dass es an der If-Anweisung scheitert => siehe großgeschriebenen Kommentar):

    <?
    $winnername="Mario"; //kommt von Flash zurück
    $winnercredits=120; //kommt von Flash zurück

    $fp = fopen("data.txt","r");
    while($data = fgets($fp,1024)){ // zeile für zeile einlesen
    $data = explode(";",$data); // jede zeile aufsplitten
    $hitlist[$data[0]] = trim($data[1]); // ein array erzeugen mit allen spielern
    }
    fclose($fp);

    arsort($hitlist);
    $eintraege=count($hitlist); // max.10 Einträge erlauben
    if ($eintraege<10) { // letzten Eintrag nicht abspalten, sondern nur holen
    end($hitlist); // letzter Eintrag selektieren
    list($key_min,$min)=each($hitlist); // Credits holen, bleibt aber im Array erhalten
    }
    else {
    $min=array_pop($hitlist); // letzten Array-Eintrag (kleinster Credits-Wert)
    }

    reset($hitlist); // damit Array-Zeiger nicht auf letztem Eintrag steht => sonst wird in While-Schleife nichts herausgeschrieben

    if ($winnercredits>$min) { // WENN ÜBERGEBENER WERT GRÖSSER ALS MIN-WERT DANN EINTRAG SCHREIBEN => DER EINTRAG SOLL ABER AUCH GESCHRIEBEN WERDEN WENN ER KLEINER ALS MIN-WERT IST => ABER NUR DANN WENN WENIGER ALS 10 EINTRÄGE VORHANDEN SIND
    $fp=fopen("data.txt","w");
    while (list ($key, $val) = each ($hitlist)) {
    fputs($fp,$key.";".$val."\n"); // vorher alle restlichen Einträge schreiben
    }
    fputs($fp,$winnername.";".$winnercredits."\n"); // und dann den neuen Eintrag am Ende anhängen
    fclose($fp);
    }
    ?>


    Kennt ihr euch einigermaßen aus oder war es zu undeutlich??
    Hoffentlich nicht!

    [Editiert von Metallica am 12-08-2001 um 12:09]
    $PHP resource 4ever$

  • #2
    wie wäre es, wenn du ersteinmal die einträge in der txt zählst. wenn weniger als 10 drinne sind tue dieses, wenn schon 10 drinne sind tue halt was anneres ....
    h.a.n.d.
    Schmalle

    http://impressed.by
    http://blog.schmalenberger.it



    Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
    ... nur ohne :-)

    Kommentar


    • #3
      ja, wäre auch 'ne Möglichkeit. Im Prinzip genügt es aber wenn man die If-Anweisung

      if ($winnercredits>$min) { // WENN ÜBERGEBENER WERT GRÖSSER ALS MIN-WERT DANN EINTRAG SCHREIBEN => DER EINTRAG SOLL ABER AUCH GESCHRIEBEN WERDEN WENN ER KLEINER ALS MIN-WERT IST => ABER NUR DANN WENN WENIGER ALS 10 EINTRÄGE VORHANDEN SIND

      um den Kommentar erweitert. Bin aber leider fast noch 'n Newbie in PHP und kriegs irgendwie nicht hin.
      $PHP resource 4ever$

      Kommentar


      • #4
        Code:
        <? 
        $winnername="Mario"; //kommt von Flash zurück 
        $winnercredits=120; //kommt von Flash zurück 
        
        $fp = fopen("data.txt","r"); 
        while($data = fgets($fp,1024)){ // zeile für zeile einlesen 
        $data = explode(";",$data); // jede zeile aufsplitten 
        $hitlist[$data[0]] = trim($data[1]); // ein array erzeugen mit allen spielern 
        } 
        fclose($fp); 
        
        // falls ein alter Eintrag existiert, den höheren im Array speichern, sonst einen neuen erstellen
        if (min($hitlist)<$winnercredits // wenn der neue größer ist als der bisherige kleinste
          || count($hitlist)<10) // oder noch keine 10 Einträge da sind
        {
          $hitlist[$winnername] = max ($hitlist[$winnername], $winnercredits);
        
          // absteigend sortieren
          arsort($hitlist); 
        
          // maximal zehn Elemente des Arrays speichern:
          $fp=fopen("data.txt","w"); 
          for (reset($hitlist), $i=0; list($key, $val) = each($hitlist) && $i<10; $i++)
            fputs($fp,$key.";".$val."\n");
          fclose ($fp);
        }
        ?>
        Die Abfrage vor dem Erweitern des Arrays sorgt dafür, daß bei gleich hohen scores der ältere Eintrag Vorrang hat.
        Und wenn am Array nix geändert wird, mußt du auch nicht speichern; daher ist der Rest auch im if.
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          Danke Titus, aber hast Du auch im Code berücksichtigt, dass sich der Spieler (wenn weniger als 10 drinnen sind) eigentlich so gut wie immer in die Highscore eintragen kann. Ein Beispiel zum besseren Verständnis:

          es sind vier Spieler eingetragen:
          Mario;120
          Enno;100
          Jan;80
          Frank;60

          Nun kommt ein fünfter Spieler hinzu mit 40 Punkten.
          Also:
          Mario;120
          Enno;100
          Jan;80
          Frank;60
          SPIELERFÜNF;40

          Wären hingegen bereits zehn Spieler eingetragen dann dürfte sich SPIELERFÜNF jetzt logischerweise nicht eintragen.

          Verstehst Du was ich meine?? => Das war nämlich das Augangsproblem.

          Bye
          $PHP resource 4ever$

          Kommentar


          • #6
            @Titus:
            Hab deine Version gerade in PHP-Edit getestet. Jetzt schreibt er mir allerdings nur mehr Strichpunkte (;; - so viele Einträge wie vorhanden sind - in die Data.txt rein?!?!


            P.S.: Ist BrainBug irgendwo aufzutreiben?? Er hat so gut wie das ganze Script geschrieben.
            $PHP resource 4ever$

            Kommentar


            • #7
              Vermutlich liegt der Fehler in der Abbruchbedingung der letzten Schleife, da fehlen ein paar Klammern. So sollte es laufen:

              for (reset($hitlist), $i=0; (list($key, $val) = each($hitlist)) && ($i<10); $i++)

              Falls nicht: Überprüfe mal mit var_dump ($hitlist); an welcher Stelle die Daten aus dem Array verschwinden.


              Und: ja, ich verstehe was du meinst. Und das wird in dem Skript auch berücksichtigt. (siehe Kommentare)
              mein Sport: mein Frühstück: meine Arbeit:

              Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

              Kommentar


              • #8
                na was soll ich sagen - mir fehlen die Worte.....

                ES FUNKT. Hab jetzt 20 Min lang alle Varianten durchgeckeckt und das script macht's jedesmal richtig.

                VIELEN VIELEN DANK Titus.
                Hast mir wirklich weitergeholfen!!!
                $PHP resource 4ever$

                Kommentar

                Lädt...
                X