Sven Rautenberg: Mehrdimensionales Array sortieren

Beitrag lesen

Moin!

Leider muß ich mich weiter als Problemfall beweisen.

Macht nix. Ich bin Kummer gewohnt. :)

Ich habe verstanden,

Das klingt doch alles schon mal gut.

Aber aus all dem komme ich nur auf eine mir umständliche erscheinende Konstruktion:

Um die Definition von einzelnen Sortierfunktionen für jedes zu sortierende Feld kommst du nicht herum. Die Frage wäre, ob das Sortieren anderweitig von einer Datenbank übernommen werden könnte - dazu müßtest du ja aber eine verwenden. :)

switch ($sort)
    {
      case "osname":
        usort($trans, "cmposname");
        break;
      case "pxhoehe":
        usort($trans, "cmppxhoehe");
        break;
      case "pxbreite":
        usort($trans, "cmppxbreite");
        break;
    }

Aber um diesen Switch kommst du herum. Da ja der Name der Sortierfunktion nur ein String in usort() ist, kannst du einfach so operieren:

usort($trans, "cmp".$sort);

Vorausgesetzt, dass in $sort immer nur die Strings drinstehen, die als Indexwerte des Arrays verwendet werden und die du als Funktionen definiert hast, und nichts anderes (ansonsten gibts Fehlermeldungen statt sortierten Arrays).

Jetzt hat ja der Array $trans nicht nur osname, pxhoehe, pxbreite, sondern noch weitere 6 Assoziationen - halb mit numerischen, halb mit alphanumerischen Werten - und das macht doch ziemlich viel Quelltext? So wie ich das jetzt sehe, wäre es nett im Script eine Funktion zu schreiben welche die 9 Funktionen erstellt:-)

Nun ja, im Prinzip kann dir geholfen werden: Du kannst zur Laufzeit des Skriptes Code generieren.

Du kannst mit Stringfunktionen den PHP-Code zusammenbasteln, den du jeweils benötigst, um zu sortieren. Siehe dazu http://www.php.net/create_function, Beispiel 3. Wobei dein Problem sich kaum mit einer einzelnen Programmzeile erschlagen lassen dürfte. Du mußt ja wissen, ob du auf String- oder Nummernbasis sortieren willst, also brauchst du zwingend eine Abfrage vorgeschaltet. Dann allerdings reichen zwei verschiedene usort() aus, einer mit numerischer Sortierung, und einer mit strcmp-Sortierung, in den jeweils das zu sortierende Arrayfeld als Stringvariable dynamisch eingefügt wird.

Ich kann mir aber nicht vorstellen, dass solch eine Aktion wahnsinnig übersichtlich wird. Solltest du den Überblich verlieren: Einfach die 9 Sortierfunktionen definieren und als String zusammengesetzt an usort() übergeben, wie ich oben angegeben habe.

- Sven Rautenberg