array_multisort() in PHP kostet Nerven

Ich habe den halben Abend versucht, herauszubekommen, was sich der/die Autor(in) Implementierung von array_multisort() in PHP gedacht haben mag. Und bin zu dem Schluss gekommen, dass ich (wenn ich mit meiner Thesis fertig bin) wahlweise


a) eine neue Funktion einreiche oder
b) die alte Funktion mit neuer Syntax und Semantik vorschlage

Mein (nicht ganz unüblicher Fall): es liegt ein zweidimensionales Array vor (für Nicht-Informatiker: sieht aus wie eine Tabelle).

id surname firstname
3 Müller Heinz
28 Apfelhuber Eva
7 Zuckerhut Paul

Jetzt scheint es mir nicht so abwegig, diese Liste nach “surname” sortieren zu wollen, so dass ich anschließend die Reihenfolge “Apfelhuber, Müller, Zuckerhut” bekomme.

Bei array_multisort() muss ich aber jetzt erst mal ein eindimensionales Array bauen, das alle IDs enthält, ein weiteres für alle Nachnamen und noch eins für Vornamen und die dann mit array_multisort() sortieren. Und anschließend natürlich alles wieder zusammenwerfen, damit ich wieder so eine Tabelle wie hier oben erhalte, nur diesmal sortiert.

Das erscheint mir zum einen nicht wirklich performant und zum anderen deutlich zu umständlich. Und stark verbesserungswürdig.

Bevor jetzt Buh-Rufe von den Zuschauerrängen kommen: nein, ich kann [in diesem speziellen Fall] meine Ergebnisse, die (oh Wunder) aus einer SQL-Datenbank kommen, nicht schon gleich mit “SELECT … ORDER BY …” sortieren.

10 thoughts on “array_multisort() in PHP kostet Nerven”

  1. Stored Procedures fallen leider aus, ich kann kein MySQL 5.0 (Beta-Version) in einer Produktivumgebung laufen lassen.

    Außerdem müsste ich dann die Anwendungslogik im Datenbanksystem abbilden… Ich weiß nicht, ob ich das wirklich kann/will.

  2. Was spricht dagegen, den AGILE-Ansatz zu verwenden? Klar kannst Du eine Sort-Funktion bauen, welche Dein Szenario bis in alle Ewigkeit hält und alle erdenklichen Fälle abdeckt. Vom akademischen Standpunkt her mag das sogar interessant sein.

    Wenn Du aber in einem Projekt hockst und *jetzt* eine Lösung für *dieses konkrete* Problem brauchst, dann würde ich ein Sonderzeichen (z.B. Gartenhag) zwischen Namen und Vornamen einbauen und danach wieder auseinandersplitten.

    Das wäre dann eben der AGILE-Ansatz, der akzeptiert, dass manchmal der Overhead für eine “saubere” Lösung einfach zu gross sein kann.

  3. Ich habe die obige Tabelle um einige Felder gekürzt. In meinem Ergebnis sind es momentan… 8 Spalten. Und da können unter Umständen noch ganz schnell welche dazu kommen.

    Die Lösung für mein Problem habe ich ja dann (auch mit array_multisort()) hinbekommen, ist umständlich aber effektiv (wenn auch nicht unbedingt effizient).

    “Schön” kann ich das immer noch mal programmieren.

  4. ‘”Schön” kann ich das immer noch mal programmieren.’ – har har, daran glaubst Du nicht wirklich, oder? 😉 😉 😉

  5. PHP bietet die “usort” Funktion:

    usort($stuff, “compare_surname”);

    function compare_surname($a, $b) {
    return strnatcasecmp($a[”surname”], $b[”surname”]);
    }

    Wenn ich das richtig sehe macht die genau das was Du brauchst. Funktioniert jedenfalls astrein.

Leave a Reply

Your email address will not be published. Required fields are marked *