Sven Rautenberg: array_multisort() - Array sizes are inconsistent

Beitrag lesen

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