[php] Mehrdimensionales Array nach gegebenen Schlüsseln sortieren, ASC sowie DESC

pointX

Neuling
Thread Starter
Mitglied seit
14.12.2009
Beiträge
406
Ort
BaWü
Hi,

ich bräuchte einmal eure Hilfe:
Ich habe folgendes Array:
PHP:
$oberarray= array(
    "0" => array // unter array 1
        (
            "ID" => "01",
            "1" => "abc",
            "5" => "98",
        ),
    "1" => array // unter array 2
        (
            "ID" => "45",
            "1" => "def",
            "5" => "76",
        ),
    "2" => array // unter array 3
        (
            "ID" => "23",
            "1" => "ghi",
            "5" => "54",
        )
);
In jedem unter-Array sind gleich viele Schlüssel vorhanden ([ID],[1],[5]).

Ich will dieses Array nun Variabel sortieren.
Ich brauche also eine Funktion, der ich sage, sie soll die Werte eines beliebigen Schlüssels ([ID],[1] oder [5]) vergleichen und die unter-arrays entsprechend anordnen.

Zum verdeutlichen am Array:
PHP:
Wenn ich nach [ID] sortiere, dann muss
$oberarray[1] mit $oberarray[2] vertauscht werden, da 
$oberarray[1][ID] > $oberarray[2][ID]
also 45 > 23:
$oberarray= array(
    "0" => array // unter array 1
        (
            "ID" => "01",
            "1" => "abc",
            "5" => "98",
        ),
    "2" => array // unter array 3   -- wurde mit unter array 2 vertauscht
        (
            "ID" => "23",                 //-- 23 ist kleiner
            "1" => "ghi",
            "5" => "54",
        )
    "1" => array // unter array 2  -- wurde mit unter array 3 vertauscht
        (
            "ID" => "45",              // -- 45 ist größer
            "1" => "def",
            "5" => "76",
        )
);

Ich muss der Funktion nun sagen können:
1.) nach welchem Schlüssel vergleichen werden soll ([ID],[1],[5]) Edit: funktioniert schon
2) Ob von A-Z oder Z-A (ASC oder DESC) sortiert werden soll. Edit: funktioniert schon
3) Am besten noch nach mehreren Kriterien sortierbar: zuerst nach [1], wenn dies gleich ist nach [5], wenn dies gleich ist nach [ID]

Leider fehlt mir der ansatz, wie ich das realisieren könnte.
array_multisort fällt leider weg, da dort numerische schlüssel neu indexiert werden ([1] und [5] würde zu [1] und [2] werden). Ich brauche aber zwingend die Schlüssel, da diese später weiter verwendet werden.

Edit:
Punk 1+2 habe ich folgendermaßen bewältigt bekommen:
PHP:
// Vergleichsfunktion
function cmp($a, $b) {
	global $sortiere;
	global $nachspalte;

    if ($a[$nachspalte] == $b[$nachspalte]) {
        return 0;
    }
    if($sortiere == '0') { // 0 = A-Z;
		return strcasecmp($a[$nachspalte], $b[$nachspalte]);
	} elseif ($sortiere == '1') { // 1 = Z-A
		return (-1)*strcasecmp($a[$nachspalte], $b[$nachspalte]);
	} else { // sollte eigentlich nicht gebraucht werden, da Funktion erst nach _POST['krit'] aufgerufen wird :)
		return 0;
	}
}
$sortiere = $_POST['sortiere']; // 0 = A-Z; 1 = Z-A
$nachspalte = $_POST['krit']; // ID, 1, 5
uasort($oberarray, "cmp");

Nur das sortieren nach mehreren Kriterien bekomme ich noch nicht ganz hin.
Wie könnte ich dies noch realisieren ?

Danke schonmal für eure Hilfe :)
Mfg.
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Ich hab schon länger nicht mehr in php skripte geschrieben. Aber ich versuch es mal:
Das Problem ist diese Zeile (analog natürlich für $sortiere == '1')
PHP:
return strcasecmp($a[$nachspalte], $b[$nachspalte]);
Hier muss bei Gleichheit nicht 0 zurückgegeben werden, sondern das nächste Kriterium überprüft werden.
Also in Pseudocode:
PHP:
$rueck =strcasecmp($a[$nachspalte], $b[$nachspalte]);
if ($rueck == 0) {
     $rueck = strcasecmp($a[$nachfolgekriterium], $b[$nachfolgekriterium]);
     if ($rueck == 0) {
          $rueck = strcasecmp($a[$letzteskriterium], $b[$letzteskriterium]);
     }
}
return $rueck;
Ich hoffe es ist klar was ich meine. Man gibt eben bei Gleichheit nicht zurück es ist gleich, sondern überprüft erst die anderen Kriterien.

Edit: Ich hab die Überprüfung auf Gleichheit am Anfang übersehen. Entweder die Abfrage rauswerfen, oder eben die Berücksichtigung aller Kriterien dort einfügen.
 
Zuletzt bearbeitet:
Ich stehe auch oft vor diesem Problem... Die einfachste Lösung aus meiner Sicht:
PHP:
function cmp($Item1, $Item2) {
    return strcmp($Item1['name'], $Item2['name']);
}  
uasort($array,"cmp");
 
Was aber nur ein Kriterium sortiert und die Sortierreihenfolge nicht berücksichtigt.
 
@neuli:

Tausend dank :)
Dass ich da nicht drauf gekommen bin, das so zu machen :)

Danke, funktioniert perfekt :cool:

@ mR.y0:
Das hatte ich ja bereits :) btw: anstatt strcmp habe ich strcasecmp genommen, dann gibt es keine Probleme mit groß-/kleinschreibung :)
Trotzdem danke.

Mfg.
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh