PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Fußballtabellen - Problem mit Sortierung (http://www.selfphp.de/forum/showthread.php?t=7836)

Ligamanager 31.05.2004 15:30:42

Fußballtabellen - Problem mit Sortierung
 
Ich bin dabei, einen Ligamanager zu programmieren.

Ich habe nur ein kleines Problem bei der Sortierung der Fußballtabellen. Will man die Bundesligatabelle sortieren, ist das ja kein Thema, da kann man mit array_multisort ohne Probleme arbeiten. Schwierig wird es, wenn man die Tabellen aus Italien, Spanien oder EM/WM sortieren will. Denn da gilt bei Punktgleichheit der direkte Vergleich und nicht die Tordifferenz. Direkter Vergleich bedeutet, dass bei allen Punktgleichen eine Art "Minitabelle" errechnet wird, bei der nur die Spiele untereinander berücksichtigt werden.

Jetzt müsste man also mit u(a)sort und einer Vergleichsfunktion arbeiten - und genau da hakt's bei mir leider. Ich weiß zwar, dass der Stringvergleich <0, 0 und >0 ergibt, aber wie muss ich das nun anstellen, dass ich (abhängig von der Einstellung, ob direkter Vergleich gilt oder nicht - das wird aus der Config ausgelesen) nun nach einander nach verschiedenen Kritieren sortieren kann?


Mal ein Beispiel bei der EM:

Tschechien - Lettland 2:0
Deutschland - Niederlande 1:0
Lettland - Deutschland 0:1
Niederlande - Tschechien 4:0
Niederlande - Lettland 2:0
Deutschland - Tschechien 1:2

würde folgende Tabelle OHNE direkten Vergleich ergeben:

1. Niederlande 6 Pkt (6:1 Tore)
2. Deutschland 6 Pkt (3:2 Tore)
3. Tschechien 6 Pkt (4:5 Tore)
4. Lettland 0 Pkt (0:5 Tore)

d.h., dass jetzt die Spiele zwischen Niederlande, Deutschland und Tschechien für den direkten Vergleich berücksichtigt werden, also ohne die Spiele gegen Lettland:

1. NED 3 (4:1)
2. GER 3 (2:2)
3. CZE 3 (2:5)

in dem Beispiel würde sich also auch im Endeffekt nichts verschieben, könnte aber gut passieren, z.B. wenn nur Deutschland und die Niederlande Punktgleich wären am Ende und Deutschland eben das Spiel gewonnen hat. Dann wäre Deutschland vorne.
Ich denke, das Prinzip is klar geworden (is eh nur zur Erklärung, damit auch Leute helfen können, die sich mit Fußball nicht auskennen ;)).


Ach ja, ein Wort vielleicht noch zu den Arrays. Ich würde gerne die Ergebnisse auslesen und dann jeweils die Team-ID als Schlüssel nehmen, d.h. z.B.:

$punkte[1] = 6;
$punkte[2] = 5;
...
$differenz[1] = 3;
$differenz[2] = -1;
usw.

und eben entsprechend sortieren.


Vielen Dank schonmal für die Hilfe!

xabbuh 21.06.2004 11:00:25

Ich hoffe, das kommt jetzt nicht zu spät. Dein Eintrag ist ja schon etwas länger her.

Ich würde es so ähnlich machen:

Die Spiele sind in einer DB "spiele" mit folgender Struktur:
ID
HID //ID DER HEIMMANNSCHAFT
AID //ID DER AUSWÄRTSMANNSCHAFT
toreH //TORE DER HEIMMANNSCHAFT
toreA //TORE DER AUSWÄRTSMANNSCHAFT

Dann liest du die Ergebnisse so aus, dass du ein Array mit folgender Struktur hast (als Beispiel für das Team mit der ID=5):

PHP-Code:

$tabelle['5']['punkte']=34;
$tabelle['5']['tore']=45;
$tabelle['5']['gegentore']=35;
$tabelle['5']['differenz']=10;

//ID IN ARRAY ABLEGEN, DER KEY IST DIE ANZAHL DER PUNKTE
foreach($tabelle as $ID => $row){
    
$punkte[$row['punkte']][]=$ID;
    }

//NACH PUNKTEN ABSTEIGEND SORTIEREN
krsort($punkte);

//JETZT DIE TABELLE ANZEIGEN
foreach($punkte as $pkt => $row){
    
//WENN ES NUR EINEN VEREIN MIT DIESER PUNKTZAHL GIBT, SOFORT AUSGEBEN
    
if(count($row)==1){
        
//HIER DANN VEREINSNAMEN, PUNKTE, TORDIFFERENZ ETC. WIE GEWÜNSCHT ANZEIGEN
        
}
    
//WENN ABER MEHR ALS EIN VEREIN DIE GLEICH PUNKTZAHL HABEN, DIE FUNKTION TABELLE AUFRUFEN
    
elseif(count($row)>1){
        
$tmp=tabelle($row);
        foreach(
$tmp as $pkt_tmp => $row_tmp){
            
//HIER DANN VEREINSNAMEN, PUNKTE, TORDIFFERENZ ETC. WIE GEWÜNSCHT ANZEIGEN
            
}
        }
    } 

Das entscheidende ist die Funktion tabelle(). Der erste Parameter ist ein Array, in dem die ID der Vereine abgelegt sind, die die gleich Punktzahl haben.

PHP-Code:

function tabelle($ID_array){
    
//ALLE BEGEGNUNGEN AUS DER DATENBANK AUSLESEN, DIE ZWISCHEN DEN MANNSCHAFTEN STATTGEFUNDEN HABEN, DIE IN DEM ARRAY $ID_array GESPEICHERT SIND
    
$query="SELECT HID, AID, toreH, toreA FROM spiele WHERE (HID='" implode("' OR HID='"$ID_array) . "') AND (AID='" implode("' OR AID='"$ID_array) . "') ORDER BY ID";
    
$result=mysql_query($query);
    
//JETZT EIN ARRAY $tmp ERSTELLEN, DAS DIE GLEICH STRUKTUR HAT WIE DAS OBEN ERWÄHNTE ARRAY $tabelle, NUR DAS HIER EBEN NUR DIE ENTSPRECHENDEN SPIELE GESPEICHERT SIND

    //JETZT DIESES ARRAY SORTIEREN
    
foreach($tabelle as $ID => $row){
        
$punkte[$ID]=$row['punkte'];
        
$tore[$ID]=$row['tore'];
        
$differenz[$ID]=$row['differenz'];
        }

    
//JETZT DAS ARRAY tmp SORTIEREN...
    
array_multisort($punkteSORT_DESC$differenzSORT_DESC$toreSORT_DESC$tmp);

    
//...UND ZURÜCKGEBEN
    
return $tmp;
    } 

Das ganze ist nicht getestet und auch nur aus dem Kopf heraus geschrieben. Fehler sind also nicht ausgeschlossen. Aber ich hoffe, dass wenigstens das Prinzip klar wird. Den Rest dürftest du dann alleine hinbekommen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:20:07 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.