Fussballtabelle sortieren

cocoon

Erfahrenes Mitglied
Auf einer Internetseite soll die aktuelle Tabelle einer Fussball-Liga stehen. Die Daten werden in einer mySQL-DB gespeichert, was auch alles ganz gut klappt. Ich kann die Ergebnisse bestimmtes Spieltage auslesen und auch die Punkte, Tore/Tordifferenz, Spiele einer Mannschaft bis zu einem bestimmten Spieltag berechnen.

An dieser Stelle komme ich dann aber auch nicht weiter: wie kann ich die Mannschaften, die momentan als Objekte mit entsprechenden Eigenschaften (Punkte, erzielte Tore, kassierte Tore) vorliegen, nach der Reihenfolge Punkte > Tordifferenz > erzielte Tore sortieren?

Ich hab bereits über google gesucht und mir auch zig mal die verschiedenen Array-Sortieralgorithmen durchgelesen, aber irgendwie ist das so abstrakt, dass ich das nicht auf meinen Fall anwenden kann.. :(
 
Bin nun doch drauf gekommen, nachdem ich vergeblich versucht habe, über tausend Ecken an ein Sortierung zu kommen und mich letztlich doch nochmal mit den Sortiermethode für Arrays auseinandergesetzt habe.

Die richtige Sortierfunktion ist usort(). Diese erwartet neben dem zu sortierendem Array als zweiten Parameter den Namen einer vorher definierten Funktion. Diese Vergleichs-Funktion schreibt man, um festzulegen, wie zwei Array-Elemente von usort() verglichen werden: die Vergleichsfunktion erwartet zwei Parameter, die zwei zu vergleichenden Arrayelementen entsprechen. Die Funktion soll einen Integer gleich NULL zurückgeben, falls die Parameter gleich sind, sonst entsprechend einen Integer kleiner bzw. grösser als NULL.

In meinem Fall bestand der Array aus Objekten "team". Um diesen Array zu sortieren brauchte ich also als Vergleichs-Funktion für usort() eine Funktion, die beschreibt, wie zwei Teams miteinander zu vergleichen sind:

PHP:
function vergleicheZweiTeams(teamA, teamB) {
  // wenn teamA-Punkte mehr als teamB-Punkte dann gib -1 zurück
  // wenn teamB-Punkte mehr als teamA-Punkte gib 1 zurück
  // sonst (wenn gleich)
      // wenn teamA-Tordiff besser als teamB-Tordiff dann gib -1 zurück
      // wenn teamB-Tordiff besser als teamA-Tordiff dann gib 1 zurück
      // sonst (wenn gleich)
          // wenn teamA-erzielte mehr als teamB-erzielte gib -1 zurück
          // wenn teamB-erzielte mehr als teamA-erzielte gib 1 zurück
          // sonst (wenn gleich)
              // gib 0 zurück
}

Anschliessend rufe ich usort() auf:

PHP:
usort($arrayMitTeams, "vergleicheZweiTeams");

Zu beachten ist, dass man als Parameter von usort() nur den Funktionsnamen der Vergleichsfunktion als String ohne Argumente übergibt und dass die Vergleichsfunktion nicht in einer Klasse deklariert bzw. keine Klassenmethode sein darf.

Hoffe das war für Leute mit einem ähnlichen Problem gut zu verstehen. Wenn nicht tut's mir leid, aber ich hab's bis vor einer Stunde selbst nicht kapiert, deshalb fällt's mir nicht so leicht, das auch noch zu erklären.

@ Mods: Könnt Ihr dann wohl schliessen (oder offen lassen falls Fragen kommen). :)
 
Original geschrieben von fasty
Wieso sortierst du nicht gleich beim Auslesen aus der DB ?
Da habe ich natürlich auch erst dran gedacht, wusste aber absolut nicht, wie ich das hätte machen sollen:
In der Tabelle "matches" werden alle Spiele (von allen Spieltagen und allen Saisons) gespeichert. Momentan lese ich alle relevanten Spiele, also einer bestimmten Saison und bis zu einem bestimmten Spieltag, aus. Daraus berechne ich anhand der Spielergebnisse die Anzahl der Punkte, Tore und doe Tordifferenz für jede Mannschaft und sortiere dann die Mannschaften.
Wie hätte ich in der SQL-Anweisung schon die Punkte (3 für einen Sieg, 1 für ein Unentschieden) und Tore für jede Mannschaft berechnen und die Reihen dann noch nach mehreren Kriterien (Punkte > Tordiff > erz. Tore) sortieren können?
 
Poste mal Deine komplette Tabellenstruktur, dann lass ich mir da mal was einfallen.
 
Mehrere Vereine so sortieren

Hallihallo ...

Ich hätte etz nur noch 1 frage. Das oben von cocoon beschriebene funktioniert ja für 2 Vereine. Kann man dieses sortierverfahren (also nach punkten / tordifferenz / positive tore) auch für mehrere vereine (also 18 oder 1000) anwenden wäre gut, wenn mir da jemand weiterhelfen könne. Vielleicht bin ich auch auf dem komplett falschen weg.

Ich bedanke mich bereits jetzt

Mfg
gunhero
 
Zurück