Thomas: Sortierung

<?
$punkte[VfB]=10;
$punkte[FCB]=9;
$punkte[S04]=9;
$punkte[HSV]=8;

$tordiff[VfB]=10;
$tordiff[FCB]=2;
$tordiff[S04]=9;
$tordiff[HSV]=-5;
?>

Hallo,
Ich scheitere Gerade an der Sortierung dieser Werte. Damit möchte ich eine Tabelle erstellen, also zuerst nach Punkten sortieren und dann nach Tordifferenz.
Raus soll am Ende dann das kommen:

VfB 10P. +10Tore
S04 9P. +9Tore
FCB 9P. +2Tore
HSV 8P. -5Tore

Hab jetzt mal mit uksort versucht was aufzubauen:
 Ein Problem gibts jedoch noch: Um zu Vergleichen brauch ich die Arrays $punkte und $tordiff und $teams in der Funktion sortieren. Allerdings ist es relativ umständlich, alles nochmal in der Funktion zu berechnen. Erweitere ich die Zeile
function sortiere($a, $b) { zu
function sortiere($a, $b,$teams,$punkte,$tordiff) { tritt leider auch ein Fehler auf, da die Funktion nur 2 Parameter erlaubt. Gibt es irgendeine Möglichkeit diese Arrays auch in der Funktion verfügbar zu machen?

<?

$teams[]='VfB';$teams[]='FCB';$teams[]='S04';$teams[]='HSV';

$punkte[VfB]=10;
$punkte[FCB]=9;
$punkte[S04]=9;
$punkte[HSV]=8;

$tordiff[VfB]=10;
$tordiff[FCB]=9;
$tordiff[S04]=11;
$tordiff[HSV]=-5;

function sortiere($a, $b) {

//Das will ich eigentlich vermeiden
$teams[]='VfB';$teams[]='FCB';$teams[]='S04';$teams[]='HSV';

$punkte[VfB]=10;
$punkte[FCB]=9;
$punkte[S04]=9;
$punkte[HSV]=8;

$tordiff[VfB]=10;
$tordiff[FCB]=9;
$tordiff[S04]=11;
$tordiff[HSV]=-5;
//Ende Vermeiden

if ($punkte[$teams[$a]]>$punkte[$teams[$b]]) { return 1; }
if ($punkte[$teams[$a]]<$punkte[$teams[$b]]) { return -1;}

if ($punkte[$teams[$a]]==$punkte[$teams[$b]]) {

if ($tordiff[$teams[$a]]>$tordiff[$teams[$b]]) { return 1; }
if ($tordiff[$teams[$a]]<$tordiff[$teams[$b]]) { return -1; }

}

}

uksort ($teams, "sortiere");
print_r($teams);

?>

  1. Ich scheitere Gerade an der Sortierung dieser Werte. Damit möchte ich eine Tabelle erstellen, also zuerst nach Punkten sortieren und dann nach Tordifferenz.

    Sieht irgendwie nach array_multisort aus, schau's dir mal an.

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
    1. Ich scheitere Gerade an der Sortierung dieser Werte. Damit möchte ich eine Tabelle erstellen, also zuerst nach Punkten sortieren und dann nach Tordifferenz.

      Sieht irgendwie nach array_multisort aus, schau's dir mal an.

      Siechfred

      Nein, nicht wirklich: Multisort sortiert mehrere Arrays, aber nicht quer durch Arrays hindurch...

      http://www.selfphp.info/funktionsreferenz/array_funktionen/array_multisort.php

      1. Hallo Thomas.

        Ich scheitere Gerade an der Sortierung dieser Werte. Damit möchte ich eine Tabelle erstellen, also zuerst nach Punkten sortieren und dann nach Tordifferenz.

        Sieht irgendwie nach array_multisort aus, schau's dir mal an.

        Siechfred

        Nein, nicht wirklich: Multisort sortiert mehrere Arrays, aber nicht quer durch Arrays hindurch...

        Wie kannst du das behaupten, nachdem du die von Siechfred verlinkte Seite durchgelesen hast? Dort steht:

        array_multisort — Sortiert mehrere oder multidimensionale Arrays

        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

        http://www.selfphp.info/funktionsreferenz/array_funktionen/array_multisort.php

        Ja, steht dort ebenso.

        Einen schönen Montag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. hi,

          Wie kannst du das behaupten, nachdem du die von Siechfred verlinkte Seite durchgelesen hast?

          Vielleicht unterstellst du letzteres ja zu Unrecht.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. $teams = array();
            $teams[] = array('name' => 'VFB', 'punkte' => 4177, ...);
            ...

            Und dann nutze usort().

            <?

            $teams[]=array('name'=>'VfB', 'punkte'=>12, 'tordiff'=>10);
            $teams[]=array('name'=>'S04', 'punkte'=>10, 'tordiff'=>8);
            $teams[]=array('name'=>'SVW', 'punkte'=>10, 'tordiff'=>9);
            $teams[]=array('name'=>'FCB', 'punkte'=>5, 'tordiff'=>-19);

            function sortiere($a, $b) {

            if ($teams[$a][punkte]>$teams[$b][punkte]) { return -1; }
            if ($teams[$b][punkte]>$teams[$a][punkte]) { return 1; }
            if ($teams[$b][punkte]==$teams[$a][punkte]) { return 0; }

            }

            uksort ($teams, "sortiere");

            echo "<pre>";
            print_r($teams);
            echo "</pre>";

            ?>

            Hab dann aber wiederum nicht den Array $teams in der Funktion sortiere verfügbar....

            1. hi,

              function sortiere($a, $b) {

              if ($teams[$a][punkte]>$teams[$b][punkte]) { return -1; }
              if ($teams[$b][punkte]>$teams[$a][punkte]) { return 1; }
              if ($teams[$b][punkte]==$teams[$a][punkte]) { return 0; }

              Es heisst 'punkte', sofern du keine Konstante namens punkte definiert hast.

              Ausserdem ist die Reihenfolge falsch - wenn der erste übergebene Wert _kleiner_ als der zweite ist, dann ist -1 zurückzugeben, etc.

              Und du kannst du dir bei nummerischen Werten diese dreifache Abfrage sparen - indem du einfach die Differenz der beiden Werte zurückgibst.

              Hab dann aber wiederum nicht den Array $teams in der Funktion sortiere verfügbar....

              Brauchst du ja auch nicht - schau dir das Beispiel im Manual bei usort noch mal aufmerksam an.
              Werden da $a und $b als Indices zum Zugriff auf Elementes des Arrays verwendet?
              Nein, sie _sind_ jeweils zwei Array-Elemente.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. ok, danke, es funktioniert

        2. Vielleicht habe ich mich schlecht ausgedrückt (;
          <?
          $teams[]='VfB';$teams[]='FCB';$teams[]='S04';$teams[]='HSV';

          $punkte[VfB]=10;
          $punkte[FCB]=9;
          $punkte[S04]=9;
          $punkte[HSV]=8;

          $tordiff[VfB]=10;
          $tordiff[FCB]=2;
          $tordiff[S04]=9;
          $tordiff[HSV]=-5;
          ?>

          Jetzt soll der Array teams zuerst nach den Punkten des jeweiligen Vereins, bei Gleichstand nach der Tordifferenz sortiert werden.

          Multisort sortiert entweder mehrere Arrays - das brauch ich nicht. Um einen mehrdimensionalen Array handelt es sich auch nicht, es ist NUR ein Array, den ich nach anderen sortieren möchte.

          Gruß
          Thomas

          1. hi,

            Jetzt soll der Array teams zuerst nach den Punkten des jeweiligen Vereins, bei Gleichstand nach der Tordifferenz sortiert werden.

            Baue dir eine für dieses Vorhaben günstigere Datenstruktur auf.

            $teams = array();
            $teams[] = array('name' => 'VFB', 'punkte' => 4177, ...);
            ...

            Und dann nutze usort().
            Schreibe dir eine Vergleichsfunktion, die zwei Array-Elemente übergeben bekommt, nach den genannten Kriterien vergleicht, und einen entsprechenden Rückgabewert liefert.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Baue dir eine für dieses Vorhaben günstigere Datenstruktur auf.

              Wollte ich auch gerade vorschlagen :) Aber auch mein Vorschlag führt zum Ziel, man braucht noch nicht mal das Array Teams:

              array_multisort($punkte, SORT_DESC, $tordiff, SORT_DESC);  
              print_r(array_keys($punkte));
              

              Siechfred

              --
              Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
            2. $teams = array();
              $teams[] = array('name' => 'VFB', 'punkte' => 4177, ...);
              ...

              Und dann nutze usort().

              <?

              $teams[]=array('name'=>'VfB', 'punkte'=>12, 'tordiff'=>10);
              $teams[]=array('name'=>'S04', 'punkte'=>10, 'tordiff'=>8);
              $teams[]=array('name'=>'SVW', 'punkte'=>10, 'tordiff'=>9);
              $teams[]=array('name'=>'FCB', 'punkte'=>5, 'tordiff'=>-19);

              function sortiere($a, $b) {

              if ($teams[$a][punkte]>$teams[$b][punkte]) { return -1; }
              if ($teams[$b][punkte]>$teams[$a][punkte]) { return 1; }
              if ($teams[$b][punkte]==$teams[$a][punkte]) { return 0; }

              }

              uksort ($teams, "sortiere");

              echo "<pre>";
              print_r($teams);
              echo "</pre>";

              ?>

              Hab dann aber wiederum nicht den Array $teams in der Funktion sortiere verfügbar....

    2. $teams = array();
      $teams[] = array('name' => 'VFB', 'punkte' => 4177, ...);
      ...

      Und dann nutze usort().

      <?

      $teams[]=array('name'=>'VfB', 'punkte'=>12, 'tordiff'=>10);
      $teams[]=array('name'=>'S04', 'punkte'=>10, 'tordiff'=>8);
      $teams[]=array('name'=>'SVW', 'punkte'=>10, 'tordiff'=>9);
      $teams[]=array('name'=>'FCB', 'punkte'=>5, 'tordiff'=>-19);

      function sortiere($a, $b) {

      if ($teams[$a][punkte]>$teams[$b][punkte]) { return -1; }
      if ($teams[$b][punkte]>$teams[$a][punkte]) { return 1; }
      if ($teams[$b][punkte]==$teams[$a][punkte]) { return 0; }

      }

      uksort ($teams, "sortiere");

      echo "<pre>";
      print_r($teams);
      echo "</pre>";

      ?>

      Hab dann aber wiederum nicht den Array $teams in der Funktion sortiere verfügbar....