Moin!
da ich ja Besserung gelobt habe zuerst mal meine Analyse einer in einer While schleife laufenden Array Sortierung:
Dein Code ist ein wunderbares Beispiel für die Schädlichkeit der Existenz der Funktion array_multisort() - oder auch ein Beweis für meine häufig getroffene Aussage: "Wenn du glaubst, array_multisort() benutzen zu müssen, machst du etwas falsch."
foreach ($gewicht_preis_array as $key => $row) {
$gewicht[$key] = $row['Gewicht'];
$preis[$key] = $row['Preis'];
}
array_multisort($gewicht, SORT_ASC, $preis, SORT_ASC, $gewicht_preis_array);
Ok, du produzierst mit einer Extra-Schleife aus einem einzelnen Array, in dem alle Werte drinstehen, noch zwei Extra-Arrays, die die Informationen ganz simpel duplizieren.
Am Ende willst du dann dein Originalarray im Prinzip nur nach Gewicht und danach nach Preis aufsteigend sortiert haben.
Nutze usort()!
> ~~~html
Array
> (
> [0] => Array
> (
> [Gewicht] => 5000
> [Preis] => 29.00
> )
>
> [1] => Array
> (
> [Gewicht] => 10000
> [Preis] => 34.00
> )
>
> [2] => Array
> (
> [Gewicht] => 20000
> [Preis] => 44.00
> )
>
> [3] => Array
> (
> [Gewicht] => 31500
> [Preis] => 54.00
> )
>
> )
Dein Array hat pro Eintrag jeweils einen kompletten Datensatz. Mit usort() und einer passenden Vergleichsfunktion ist das ein Einzeiler (plus die Funktion):
Der Code zum Sortieren:
usort($gewicht_preis_array, 'gewicht_preis_compare');
Und zum Vergleichen:
function gewicht_preis_compare($a, $b) {
if ($a['Gewicht'] == $b['Gewicht']) {
if ($a['Preis'] == $b['Preis']) {
return 0;
}
return ($a['Preis'] < $b['Preis']? -1 : 1);
}
return ($a['Gewicht'] < $b['Gewicht']? -1 : 1);
}
Die Vergleichsfunktion prüft, ob das Gewicht gleich ist. Wenn ja, entscheidet der Preis über die Sortierung. Ist auch der Preis gleich, liefert die Sortierfunktion eine 0 zurück als Info, dass beide Werte gleich sind. Ansonsten liefert die Funktion entweder -1 oder 1 zurück, je nachdem ob der Datensatz $a oder $b kleiner ist gemäß der Sortieranforderung.
- Sven Rautenberg