Fussballtabelle sortieren - Problem

DoRiMaN

Erfahrenes Mitglied
HILFE Fussballtabelle sortieren (Array) - Direktbegegnung

Hallo an alle...

Hab da mal ein Problem...

Ich habe da ein Array, mit dem Team, den Punkten, etc:

PHP:
$teams[$b]['name'] = mysql_result($query2,$b,"team_original_name");
$teams[$b]['played'] = $played;
$teams[$b]['won'] = $won;
$teams[$b]['lost'] = $lost;
$teams[$b]['draw'] = $draw;
$teams[$b]['goals'] = $goals.' / '.$vgoals;
$teams[$b]['points'] = $points;

Nehmen wir an, das Array sieht dann so aus:

PHP:
$array[0]['name'] = 'Team A';
$array[0]['points'] = 3;
$array[1]['name'] = 'Team B';
$array[1]['points'] = 0;
$array[2]['name'] = 'Team C';
$array[2]['points'] = 5;
$array[3]['name'] = 'Team D';
$array[3]['points'] = 1;
(die restlichen Werte, "won" usw sind nicht wichtig im Moment...)

Nun habe ich nach langem Probieren und Suchen, auf php.net einen Script gefunden:

PHP:
<?php
function cmp ($a, $b) {
   return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "Zitronen";
$fruits[1]["fruit"] = "Äpfel";
$fruits[2]["fruit"] = "Trauben";

usort($fruits, "cmp");

while (list ($key, $value) = each ($fruits)) {
   echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>

Gut, editiert, mein Array reingebastelt... jedoch lautet nun die Ausgabe des Arrays:

Team B - 0
Team D - 1
Team A - 3
Team C - 5

Ich habe es einfach nicht geschafft, die Funktion so umzuschreiben, dass er mir das Array "verkehrt" sortiert... das Team mit der höchsten Punktzahl sollte schliesslich zuoberst sein ;)

Weiss jemand wie ich dieses Problem lösen kann?
Und wenn ja, wäre es auch möglich, dieses Array nach Punkte zu sortieren, und bei gleichem Punktestand nach Tordifferenz?

Thanks & Greetz
DoRiMaN
 
Zuletzt bearbeitet:
Wie wäre es damit, wenn du den Rückgabewert der Funktion [phpf]strcmp[/phpf] einfach umkehrst und dann erst zurückgibst:
PHP:
<?php 
function cmp ($a, $b) { 
   $vergleich = (strcmp($a["points"], $b["points"]) == 1) ? 0 : 1;
   return $vergleich; 
} 

$array[0]['name'] = 'Team A'; 
$array[0]['points'] = 3; 
$array[1]['name'] = 'Team B'; 
$array[1]['points'] = 0; 
$array[2]['name'] = 'Team C'; 
$array[2]['points'] = 5; 
$array[3]['name'] = 'Team D'; 
$array[3]['points'] = 1;
 
usort($array, "cmp"); 

while (list ($key, $value) = each ($array)) { 
   echo $array[$key]['name'].": " . $value["points"] . "<br />"; 
} 
?>
 
hui, das wars! :)

nun sortiert es richtig! Danke ludz! :)

aber wie kann ich jetzt machen dass es nach der Punktzahl auch nach Tordifferenz sortiert?
Ich kann ja nicht nochmal diese Funktion durchlaufen lassen, sonst sortiert es alles wieder um... :(


Thx & Greetz

DoRiMaN
 
Das könnte helfen (dann bräuchtest du auch kein usort() mehr):
» [phpf]array_multisort[/phpf]
 
Hmm, ja, könnte funktionieren... jedoch hab ich soeben was anderes erfahren:

Wenn zwei Mannschaften die gleiche Punktzahl erreicht haben, entscheidet der direkte Vergleich über die bessere Platzierung. Bei einem Unentschieden wird die Tordifferenz gewertet, danach entscheidet die höhere Anzahl geschossener Tore.
:(

Momentan hab ich keinen Plan wie ich das machen soll, denn ich sollte vor der Ausgabe irgendwie nochmals in die DB gehen, usw... :(

aber wenn jemand Ideen hat, bitte melden...

Trotzdem Danke an ludz! :)

Greetz, DoRiMaN
 
Wenn du dir die Kommentare bei array_multisort durchgelesen hättest, dann wärst du auf eine interessante Lösung von "sdavey at datalink dot net dot au" gestoßen. Ein bisschen umgeschrieben, dann erhältst du folgendes:

PHP:
<?php 
$array[0]['name'] = 'Team A'; 
$array[0]['points'] = 3;
$array[0]['goals'] = '115 / 31'; 
$array[1]['name'] = 'Team B'; 
$array[1]['points'] = 3;
$array[1]['goals'] = '120 / 33';  
$array[2]['name'] = 'Team C'; 
$array[2]['points'] = 3;
$array[2]['goals'] = '170 / 113';  
$array[3]['name'] = 'Team D'; 
$array[3]['points'] = 3;
$array[3]['goals'] = '115 / 58'; 

foreach ($array as $key => $row) {
   list($own, $others) = explode(' / ', $row['goals']);
   $points[$key] = $row["points"];
   $name[$key] = $row["name"];
   $points[$key] = $row["points"];
   $goal_diff[$key] = $own - $others;
   $goals[$key] = $own;
}

array_multisort($points, SORT_DESC, $goal_diff, SORT_DESC, $goals, SORT_DESC, $array);

while (list ($key, $value) = each ($array)) { 
   echo $array[$key]["name"].": " . $value["points"] . "<br />"; 
} 
?>
 
ich habs schon gelesen, jedoch ist mein Problem jetzt ein anderes...

ich lese die Werte aus 2 Tabellen (matches und Teams)... die Spielresultate sind in matches gespeichert... nach dem lesen "generiere" ich durch verschiedene schlaufen das Array mit den Teams und den Toren usw...

aber...
Wenn zwei Mannschaften die gleiche Punktzahl erreicht haben, entscheidet der direkte Vergleich über die bessere Platzierung. Bei einem Unentschieden wird die Tordifferenz gewertet, danach entscheidet die höhere Anzahl geschossener Tore.
dies ist mein Problem... ich weiss nicht, wie ich nun mit den Arrays weiterarbeiten soll, wenn ich zuerst ermitteln muss, wie der direkte Vergleich ausgegangen ist... Weisst du was ich meine? Vielleicht sollte ich versuchen, einen neuen Array-Wert zu machen, mit den "Gesamtpunkten", welcher auch die Punkte aus dem direkten Vergleich enthält, oder so.... keine Ahnung... muss mal länger überlegen...

Greetz, DoRiMaN
 
Was meint denn "der direkte Vergleich"?
Das Sortieren der Tordifferenz und der Anzahl geschossener Tore sollte ja kein Problem mehr darstellen (siehe meinen letzten Beitrag).
 
Nein, das sollte kein Problem mehr sein... hatte es vorher auch geschafft, dein Script ist jedoch weniger Buggy :D

Der direkte Vergleich ist das Spiel zwischen Team A und Team B, wenn beide gleich viele Punkte haben...

wenn Team A gewonnen hat, ist Team A weiter oben, bei Unentschieden entscheidet die Tordifferenz... :)

Greetz, DoRiMaN
 
Sollte kein Problem mehr sein...

jetzt läufts aber plötzlich nicht mehr :(

es kommt immer:

Warning: Cannot use a scalar value as an array in ***\standings.phpon line 83
Warning: Cannot use a scalar value as an array in ***\standings.phpon line 85
Warning: Cannot use a scalar value as an array in ***\standings.phpon line 87
Warning: array_multisort(): Argument #1 is expected to be an array or sorting flag that has not already been specified in ***\standings.phpon line 89

mein Script:

PHP:
// Weiter oben startet eine for() Schlaufe, die jedes Team in das Array schreibt...
     $teams[$b]['name'] = mysql_result($query2,$b,"team_original_name");
     $teams[$b]['short'] = mysql_result($query2,$b,"team_short");
     $teams[$b]['played'] = $played;
     $teams[$b]['won'] = $won;
     $teams[$b]['lost'] = $lost;
     $teams[$b]['draw'] = $draw;
     $teams[$b]['goals'] = $goals.' / '.$vgoals;
     $teams[$b]['points'] = $points;
} // Ende der obigen for() Schlaufe
foreach ($teams as $key => $row) {
     list($own, $others) = explode(' / ', $row['goals']);
     $points[$key] = $row["points"]; // Zeile 83
     $name[$key] = $row["name"];
     $points[$key] = $row["points"]; // Zeile 85
     $goal_diff[$key] = $own - $others;
     $goals[$key] = $own; // Zeile 87
}
array_multisort($points, SORT_DESC, $goal_diff, SORT_DESC, $goals, SORT_DESC, $teams); // Zeile 89

Ich weiss wirklich nicht warums jetzt plötzlich nicht mehr läuft :S editiert hab ich an dieser Funktion nichts... hoffe jemand kann helfen... :(

Greetz & Thx, DoRiMaN
 
Zurück