sortierung nach fremder quelle

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

  • sortierung nach fremder quelle

    hallo. ich arbeite an einer PHP-Online Liga für einen egoshooter.

    bisher funktionierte es so, dass es eine tabelle für die user und eine für die matches gab. die user hatten standardgemäß 1000 punkte, und wenn einer ein match gewonnen hatte, wurde die usertabelle geupdated und dann stand in seiner usertabelle eben z.B. 1004 punkte. die rankingseite zu machen war dann unkompliziert, einfach die benötigten infos der "user"tabelle selektieren und "ORDER BY POINTS" machen.

    ich möchte das system aber ändern, und zwar dass nun nicht mehr die nach jedem match neu fest gelegten punkte eingetragen werden sondern ich habe mir eine funktion gebaut, die in der matches tabelle nachschaut wieviele spiele der spieler gespielt hat, wieviele und wie hoch gewonnen hat und demnach die gesamtpunktzahl des spielers berechnet wird. Ich könnte problemlos eine funktion bauen die z.B. "get_playerpoints($userID)" heisst und für die userIDs die punkte ermittelt.

    (ich mache das deshalb so, da evtl gespielte matches, die aber ungültig waren z.B. wegen cheatens gelöscht werden könnten, und der admin dann immer dem user manuell die beim match errungenen punkte abziehen müsste)

    leider hätte ich dann das problem, dass ich bei der rankingsanzeige nicht mehr "order by points" angeben muss, da dieser wert eigentlich garnicht mehr existiert. habt ihr eine idee wie man es trotzdem hinbekommen könnte ? das problem liegt auch darin dass erstmal für alle user der punktestand ermittelt werden muss, und dann eine sortierung erfolgen muss. wäre es z.B. möglich dass man quasi ein array erstellt dass die userIDs in der richtigen punktereihenfolge (nachdem für alle userIDs die punkte ermittelt wurden) anzeigt und dann für jede userID eine select anfrage gemacht wird ?

  • #2
    Nicht zu Ende normalisiert? Ich vermute nämlich, dir fehlt eine Tabelle

    games(id, winner_uid, looser_uid, score, when, what, ...)

    Mit dieser müßtest du den Punktestand eines User nicht in seinem User-Datensatz speichern, aber auch nicht jedesmal mit PHP ausrechnen. Stattdessen wird clever geJOINt, ORDER BY geht auch ... und wenn jemand beschissen hat, wird das Spiel in games gelöscht oder entsprechend geändert.

    Kommentar


    • #3
      natürlich wäre so eine extra tabelle möglich, aber auch nicht viel effektiver

      die ranking-punkte werden nach dem ELO system berechnet (infos dazu findet man z.B. bei wikipedia). d.h. es kann auch sein dass man punkte erhält obwohl man das spiel verloren oder draw gespielt hat.

      ich nenne einfach mal ein paar werte die bei mir in der matches tabelle bereits drin sind
      - challenger_userid, challended_userid
      - challenger(ed)_score_map1(2) => das sind einfach die mapergebnisse
      - winner_id, loser_id
      - challenger(ed)_points_difference - die anzahl der rankingpunkte die bei diesem match für den challenger/challenged spieler hinzugekommen sind.

      wieviel ranking--punkte ein spieler also hat kann eigentlich (mit meinem wissen) nur ermittelt werden, in dem man alle matches selektiert bei denen userID = challenger_userid ist und dann alle challenger_points_diff werte addiert und danach das gleiche mit challenged_userid macht. und sowas .. naja mit left join geht das sicherlich nicht
      Zuletzt geändert von NameZero912; 12.01.2006, 17:17.

      Kommentar


      • #4
        bin jetzt ein wenig weiter gekommen. ich habe es geschafft, eine array zu bauen dass als key die punktzahl des spielers hat, als value dann die userID, und das ganze zu sortieren

        PHP-Code:
        $sql "SELECT id FROM `".$prefix."members`";
        $query mysql_query($sql);
        $users = array();
        while (
        $fetch = @mysql_fetch_array($query))
        {
            
        $points get_playerpoints($fetch['id']);
            
        $users["$points"] = $fetch['id'];
        }
        function 
        cmp($a$b)
        {
           if (
        $a == $b) {
               return 
        0;
           }
           return (
        $a $b) ? -1;
        }
        uksort($users"cmp"); 
        mein problem liegt jetzt aber darin, dass, wenn mehrere spieler die gleiche Punktzahl haben, nur noch einer angezeigt wird, der mit der höchsten userID. ich würde es aber gern haben dass nicht einfach user verschwinden, sondern die sorterung im fall der gleichheit der punkte (key-value) so erfolgt, dass nach absteigenden values (also userIDs) sortiert wird .... wie würde das gehen ?

        Kommentar


        • #5
          Bau dein Array doch anders auf. Zurzeit ist es ja so, das eine Punktzahl mit einer Benutzer-ID verknüpft ist. Also müsste aus deinem Eindimensionalen Array ein Zweidimensionales Array gemacht werden.
          PHP-Code:
          // ohne Gewähr :p
          // aus:
          $users["$points"] = $fetch['id'];

          // wird:
          $users["$points"][] = $fetch['id']; 
          Beim Durchlaufen des Arrays musst du beachten, dass es jetzt zwei Dimensionen sind. Aber das sollte ja hoffentlich kein problem für dich sein

          Kommentar


          • #6
            yeah, vielen dank, hat geklappt

            ich habe das "[]" hinzugefügt, und ich musste halt nach der ersten foreach schleife gleich nochmal eine zweite hinbauen:
            PHP-Code:
            foreach ($users as $key => $value) {
                foreach (
            $users["$key"] AS $key => $value)
                {
                .....
                }

            Kommentar


            • #7
              Wobei es auch eine For-Schleife sein könnte - aber hauptsache es geht

              Kommentar

              Lädt...
              X