PHP [ERLEDIGT] Mehrdimensionales Array sortieren

M3Y3R

Well-known member
ID: 336361
L
8 Mai 2006
1.608
60
Hallo,

ich sitze hier vor einem Problem und möchte gerne eure Kompetenz in Anspruch nehmen.

Folgendes Szenario:
Für ein Reporting bekomme ich ein Mehrdimensionales Array zurück, welches als Key die Kalenderwoche oder den jeweiligen Monat beinhaltet. Leider liegen diese in keiner vernünftigen Reihenfolge vor. Auch der Versuch, das ganze über MySQL zu steuern ist fehlgeschlagen, da einige Daten erst zu einem späteren Zeitpunkt vorliegen. Ich habe nun also folgendes Array:

PHP:
$reporting = array(
   'KW 8' => array(
        'eingang' => 45,
        'ausgang' => 46
    ),
    'KW 10' => array(
        'eingang' => 13,
        'ausgang' => 21
    ),
    'KW 9' => array(
        'eingang' => 65,
        'ausgang' => 2
    )
);

Nun möchte ich dieses Array an Hand des ersten Key-Elements (KW 1 -10) sortieren lassen. Die untergeordneten Elemente müssen dabei erhalten bleiben.

array_multisort() würfelte mir das Array komplett durch einander. Gleiches Verhalten erhielt ich, wenn ich mit uasort() und einer Vergleichsfunktion das Array sortieren wollte.

Wie bekomme ich es nun hin, dass das Array letztendlich wie folgt aufgebaut ist:

PHP:
$reporting = array(
    'KW 8' => array(
        'eingang' => 45,
        'ausgang' => 46
    ),
    'KW 9' => array(
        'eingang' => 65,
        'ausgang' => 2
    ),
    'KW 10' => array(
        'eingang' => 13,
        'ausgang' => 21
    )
);

Über Vorschläge wäre ich sehr dankbar. ;)


Viele Grüße
M3Y3R
 
Zuletzt bearbeitet:
Das Problem wird bei ksort sein, dass es "KW 9" nach "KW 10" sortieren wird, da es ja einen Stringvergleich macht.

Ich fürchte, da wirst Du um eine eigene Sortierung mittels uksort nicht drum rum kommen:
PHP:
uksort($array, function ($a, $b) {
    $kw_a = (int)substr($a, 3);
    $kw_b = (int)substr($b, 3);
    return $a - $b;
});
Untested. Evtl. musst Du mit der Ermittlung der KW nochmal rumspielen oder bei der Subtraktion $a und $b umstellen, wenn die Sortierung falschrum erfolgt.
 
Das Problem wird bei ksort sein, dass es "KW 9" nach "KW 10" sortieren wird, da es ja einen Stringvergleich macht.
Genau das war das Problem ;-)

Ich fürchte, da wirst Du um eine eigene Sortierung mittels uksort nicht drum rum kommen:
PHP:
uksort($array, function ($a, $b) {
    $kw_a = (int)substr($a, 3);
    $kw_b = (int)substr($b, 3);
    return $a - $b;
});
Sowas ähnliches hatte ich auch schon versucht, lediglich nicht bedacht, dass ich das "KW" heraus strippen muss...

Untested. Evtl. musst Du mit der Ermittlung der KW nochmal rumspielen oder bei der Subtraktion $a und $b umstellen, wenn die Sortierung falschrum erfolgt.

Dein Beispiel ist mir sehr hilfreich gewesen! Musste das zwar noch ein wenig anpassen, aber nun funktionierts.

Für die Nachwelt:
PHP:
uksort($consultantData['data'], function ($a, $b) {
	$kw_a = (int)substr($a, 3);
	$kw_b = (int)substr($b, 3);

	if($kw_a == $kw_b) {
		return 0;
	}
	return ($kw_a > $kw_b) ? 1 : -1;
});


Vielen Dank, tleilax!