Array mehrfach sortieren

wTech

Grünschnabel
Hallo Leute,

Ich habe ein mehrdimensionales Array, welches ich 2 mal sortieren will. Ich möchte erst alle Einträge gruppieren und will sie dann nach Namen ordnen.
Nachfolgend mal der Aufbau meines Arrays:
0 => name = "name_1"
0 => group = "gruppe_1"
1 => name = "name_2"
1 => group "gruppe_2"
Das Problem ist nun, dass manche Namen doppelt vorkommen. Die sollen jedoch auch bestehen bleiben und nicht aussortiert werden.

Über "array_multisort" kann ich das Array nun nach dem Namen sortieren, jedoch sollen die Einträge dann auch nach Gruppe gruppiert werden. Da weiß ich jedoch nun nicht mehr weiter und brauche einen Lösungsansatz von euch.;)

MfG
 
So bekommst du das Array aufsteigend sortiert nach der Gruppe und dann nach Namen:

PHP:
<?php
$arr[] = array('name' => 'name5', 'group' => 'gruppe5');
$arr[] = array('name' => 'name1', 'group' => 'gruppe1');
$arr[] = array('name' => 'name3', 'group' => 'gruppe3');
$arr[] = array('name' => 'name6', 'group' => 'gruppe6');
$arr[] = array('name' => 'name4', 'group' => 'gruppe4');
$arr[] = array('name' => 'name2', 'group' => 'gruppe2');

foreach ($arr as $key => $row) {
    $name[$key]    = $row['name'];
    $gruppe[$key] = $row['group'];
}

array_multisort($gruppe, SORT_ASC, $name, SORT_ASC, $arr);

for ($a = 0; $a < count($arr); $a++) {
	echo $arr[$a]['group'] ." - " .$arr[$a]['name'] ."<br />";
}
?>

Ist so bei php.net als "Beispiel #3 Datenbankdaten sortieren" beschrieben.
 
Du kannst dir eine eigene Sortierfunktion schreiben
Achtung, ob meine zu 100% alles abdeckt hab ich nicht getestet...

PHP:
<?php
//Testdaten
$array[] = array('name' => 'name_1', 'group' => 'B');
$array[] = array('name' => 'name_2', 'group' => 'B');
$array[] = array('name' => 'name_3', 'group' => 'A');
$array[] = array('name' => 'name_3', 'group' => 'B');
$array[] = array('name' => 'name_0', 'group' => 'A');

//Sortieren
uasort($array, 'compare');
var_dump($array);

//Sortierfunkion
function compare($a, $b){
    if ($a['group'] == $b['group'] && $a['name'] == $b['name']) {
        return 0;
    }
    if ($a['group'] == $b['group']) {
        return ($a['name'] < $b['name']) ? -1 : 1;
    }
    if ($a['group']< $b['group']) {
        return ($a['name'] < $b['name']) ? -1 : 0;
    }
    return 1;
}
?>

Nachtrag:
Die Lösung von tombe ist eleganter
 
Zuletzt bearbeitet:
Zurück