Sortierung von Objekte nach verschiedenen Attributen

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

  • Sortierung von Objekte nach verschiedenen Attributen

    Hallo,

    ich habe ein kleines Problemchen.

    Ich möchte eine Fußballtabelle anhand meiner Ergebnisse auf der Datenbank erstellen.
    Bisher passiert das alles mit Arrays :

    PHP-Code:
    //Das Array wird in einer Schleife mit den Daten der 18 Vereine gefüllt 
    $data_Vereine[] = array("Team" => $TEAMNAME
                        
    "Platz" => 0,
                        
    "Heimpunkte" => $heimpunkte,
                        
    "Heimsiege" => $heimS,
                        
    "Heimunentschieden" => $heimU,
                        
    "Heimniederlagen" => $heimN,
                        
    "Heimtore" => $heimtore,
                        
    "Heimgegentore" => $heimgegentore,
                        
    "Auswärtssiege" => $auswS,
                        
    "Auswärtsunentschieden" => $auswU,
                        
    "Auswärtsniederlagen" => $auswN,
                        
    "Auswärtstore" => $auswtore,
                        
    "Auswärtsgegentore" => $auswgegentore,
                        
    "Auswärtspunkte" => $auswpunkte,
                        
    "Gesamtpunkte" => $auswpunkte $heimpunkte $Abzug,
                        
    "Tordifferenz" => ($heimtore $auswtore)-($heimgegentore $auswgegentore),
                        
    "Toregesamt" => ($heimtore $auswtore)
                       );
                        
    foreach (
    $data_Vereine as $key => $row_Vereine
    {
        
    $Verein[$key]  = $row_Vereine['Team'];
        
    $Gesamtpunkte[$key] = $row_Vereine['Gesamtpunkte'];
        
    $Tordifferenz[$key] = $row_Vereine['Tordifferenz'];
        
    $Toregesamt[$key] = $row_Vereine['Toregesamt'];
    }

    // Sortieren nach Gesamtpunkten, Tordifferenz, Gesamttoren
    array_multisort($GesamtpunkteSORT_DESC$TordifferenzSORT_DESC$ToregesamtSORT_DESC$data_Vereine); 
    Ich würde das ganze jetzt gerne umstallen und meine neuen TEAM-Klassen benutzen.

    PHP-Code:
    class Team
    {
        var 
    $Team;
        var 
    $Punkte;
        var 
    $Tordifferenz;
        var 
    $Toregesamt;
        
    //... alle anderen Attribute wie im Array oben
    }

    $Team_1 = new Team();
    $Team_2 = new Team();
    $Team_3 = new Team();
    //... Bis $Team_18 
    Ich bin dann irgendwann an dem Punkt, dass ich $Team_1 bis $Team_18 habe mit den gleichen Daten gefüllt wie bei den Arrays oben.
    Jetzt sind die ja noch unsortiert.

    Wie bekomme ich die 18 Instanzen jetzt so sortiert, dass ich am Ende eine Tabelle ausgeben kann mit den ganzen Attibuten. Eben sortiert nach den 3 Attributen $Punkte, $Tordifferenz und $Toregesamt???

    Per SQL vorsortieren geht nicht, weil die Punkte ja erst im Lauf der Schleife ermittelt werden und teilweise noch Abzüge berechnet werden usw.

    Muss ich die 18 Instanzen jetzt in ein Array packen und das dann sortieren?
    Wenn ja, wie sage ich dem Array dann, nach was es sortieren soll?

    Wär cool, wenn mir da jemand helfen könnte.
    Vielen Dank.

  • #2
    Zitat von southdevils Beitrag anzeigen
    Muss ich die 18 Instanzen jetzt in ein Array packen
    Das machst du selbstverständlich sowieso, weil durchnummerierte Variablennamen schon immer eine blöde Idee waren.

    Wenn ja, wie sage ich dem Array dann, nach was es sortieren soll?
    usort plus eigene kleine Vergleichsfunktion.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Zitat von wahsaga Beitrag anzeigen
      Das machst du selbstverständlich sowieso, weil durchnummerierte Variablennamen schon immer eine blöde Idee waren.

      usort plus eigene kleine Vergleichsfunktion.
      1. Klar. ... sollte ja nur der Veranschaulichung dienen
      Würde dann am Ende in etwa so aussehen ...
      PHP-Code:
      $Vereine[1] = $Team_1;
      $Vereine[2] = $Team_2;
      $Vereine[3] = $Team_3;
      // ... 
      2. Den Tipp mit usort hab ich schon mal gelesen. Konnte aber bisher noch kein konkretes Beispiel finden, wie das mit den Klassenattibuten funktioniert.
      Zuletzt geändert von southdevils; 20.06.2012, 12:30.

      Kommentar


      • #4
        PHP-Code:
        function compareTeams($team1,$team2
        {

          
        // Zugriff über $team1->Punkte;


        Kommentar


        • #5
          Du meinst so etwa, wenn ich mehrere Kriterien habe???:

          PHP-Code:
          function compareTeams($team1,$team2
          {

              
          $retVal 0;
              
            
          // Zugriff über $team1->Punkte;
              
          if ($team1->punkte == $team2->punkte
              {
                  if (
          $team1->tordifferenz == $team2->tordifferenz
                  {
                      if (
          $team1->gesamttore == $team2->gesamttore
                      {
                          
          $retVal 0;
                      }
                      else 
                      {
                          
          $retVal = ($team1->gesamttore $team2->gesamttore) ? +: -1;
                      }
                  }
                  else 
                  {
                      
          $retVal = ($team1->tordifferenz $team2->tordifferenz) ? +: -1;
                  }
              }
              else 
              {
                  
          $retVal = ($team1->punkte $team2->punkte) ? +: -1;
              }
              
              return 
          $retVal;
          }  

          //und danach

          usort($Vereine"compareTeams"); 
          Zuletzt geändert von southdevils; 20.06.2012, 13:12.

          Kommentar


          • #6
            Gegenfrage: funktionierts?

            Kommentar


            • #7
              Hey. Funktioniert genau so wie es soll.
              Danke für eure Hilfe.

              Werde jetzt noch die unschönen Variablen ändern
              Und das ganze ins eigentlich skript einbauen, aber vom Prinzip funktionierts.

              Für alle, die das gleiche Problem haben und es noch mal nachvollziehen wollen. Heir das ganze Skript:

              PHP-Code:
              class Team
              {
                  var 
              $Team;
                  var 
              $Punkte;
                  var 
              $Tordifferenz;
                  var 
              $Toregesamt;
                  
              //...
              }

              $Team_1 = new Team();
              $Team_2 = new Team();
              $Team_3 = new Team();

              $Team_1->Punkte 3;
              $Team_2->Punkte 3;
              $Team_3->Punkte 2;

              $Team_1->Tordifferenz 3;
              $Team_2->Tordifferenz 3;
              $Team_3->Tordifferenz 4;

              $Team_1->Toregesamt 6;
              $Team_2->Toregesamt 5;
              $Team_3->Toregesamt 7;

              $Team_1->Team 'team1';
              $Team_2->Team 'team2';
              $Team_3->Team 'team3';

              $Vereine[1] = $Team_1;
              $Vereine[2] = $Team_2;
              $Vereine[3] = $Team_3;

              function 
              compareTeams($team1,$team2
              {

                  
              $retVal 0;
                  
                
              // Zugriff über $team1->Punkte;
                  
              if ($team1->Punkte == $team2->Punkte
                  {
                      if (
              $team1->Tordifferenz == $team2->Tordifferenz
                      {
                          if (
              $team1->Toregesamt == $team2->Toregesamt
                          {
                              
              $retVal 0;
                          }
                          else 
                          {
                              
              $retVal = ($team1->Toregesamt $team2->Toregesamt) ? +: -1;
                          }
                      }
                      else 
                      {
                          
              $retVal = ($team1->Tordifferenz $team2->Tordifferenz) ? +: -1;
                      }
                  }
                  else 
                  {
                      
              $retVal = ($team1->Punkte $team2->Punkte) ? +: -1;
                  }
                  
                  return 
              $retVal;
              }  

              usort($Vereine"compareTeams");  

              foreach (
              $Vereine as $item) {
                  echo 
              $item->Team " " $item->Punkte " " $item->Tordifferenz " " $item->Toregesamt "<br>";

              Kommentar


              • #8
                Danke fürs Posten der Lösung. Sehr vorbildlich!

                Kleiner Verbesserungsvorschlag, auch wenns zur Zeit ja nur Demo-Code ist: Man kann auf die Objekte auch direkt aus den Arrays zugreifen:

                PHP-Code:
                $Vereine[1] = new Team();
                $Vereine[1]->Team 'team1';
                $Vereine[1]->Punkte 3;
                $Vereine[1]->Tordifferenz 3;
                $Vereine[1]->Toregesamt 6
                Wenn du dann statt ->Team einfach ->Name verwendest, wird das ganze noch intuitiver. Und irgendwann übergibst du den Teamnamen dann direkt im Konstruktor: new Team('Team 1');

                Kommentar

                Lädt...
                X