Sven Rautenberg: Mehrdimensionales Array sortieren

Beitrag lesen

Moin!

Du hast die einzelnen Elemente, die ja komplett verschoben sortiert werden sollen, in _einem_ Array. Deshalb ist array_multisort() falsch, weil das Dinge in _mehreren_ Arrays sortiert.
Du hast sicher recht, aber es funktionert!

Ist aber superumständlich. Außerdem ist "es funktioniert" bekanntlich keine ausreichende Begründung für irgendwas. Im IE funktioniert ja auch vieles. :)

function cmp ($a, $b) {
        return strcmp($a["osname"], $b["osname"]);
    }
    usort($trans, "cmp");

Wobei ich damit seit gestern an 2 Problemen scheitere:

  1. Was, wenn ich nicht nach "osname", sondern nach $sort sortieren will (wenn ich die cmp-Funktion um einen Parameter - eben $sort - erweitere, dann beschwert sich PHP)?

Dann brauchst du eine andere Sortierfunktion. Der Name cmp ist ja nicht fest vorgegeben, sondern von dir frei gewählt.

  1. Wie kann ich der Funktion mitteilen, ob sie numerisch oder alphanumerisch sortieren soll (zur Zeit wird "111" vor "12" gereiht)?

Auch das ist logisch, denn deine Vergleichsfunktion ist "strcmp", und die vergleicht eben alphanumerisch.

Deine Vergleichsfunktion soll einen der drei Werte -1, 0 oder 1 zurückgeben, je nachdem, ob $a oder $b als "weiter nach vorn sortieren" zu betrachten ist.

Dazu kannst du beliebig komplexe Operationen anstellen, Abfragen machen etc. Auch nach mehreren Feldern nacheinander sortieren geht natürlich. Als Beispiel: Wenn in einem Datensatz (nicht deinen, sondern irgendwelchen) ein Firmenname sowie Nachname und Vorname angegeben sein können, wäre es kein Problem, eine Sortierfunktion zu schreiben, die in der Reihenfolge "Firma, Nachname, Vorname" sortiert, wenn es einen Firmennamen gibt, aber auch nur "Nachname, Vorname" verwendet, wenn keine Firma angegeben ist, und als letzte Alternative auch einfach nur "Vorname" benutzt. So würden Vorname "Ralf", Nachname "Rautenberg" und Firmenname "RZ Uni" in dieser Reihenfolge sortiert werden.

Natürlich benötigst du, wenn du unterschiedliche Sortierfunktionen benutzen willst, auch unterschiedliche usort()-Befehle, wenn du die Sortierfunktion fest angibst. Aber: Der Sortierfunktionsname ist im usort()-Aufruf ein String. Nutze das ggf. einfach aus. usort($array, $sortierfunktionsname) ist erlaubt.

- Sven Rautenberg