Arrays sortieren. Special case ;-)
Kristof
- php
Hallo,
ich habe ein Array $array, das so aussieht:
array(2) {
[0]=>
array(2) {
["id"]=>
int(4)
["d"]=>
float(31.4903950302)
}
[1]=>
array(2) {
["id"]=>
int(5)
["d"]=>
float(30.1773775515)
}
}
Dieses Array soll nach dem Wert "d" des Subarrays sortiert werden. Also im konkreten Fall so aussehen:
array(2) {
[0]=>
array(2) {
["id"]=>
int(5)
["d"]=>
float(30.1773775515)
}
[1]=>
array(2) {
["id"]=>
int(4)
["d"]=>
float(31.4903950302)
}
}
wie geht das?
Danke
Kristof
Lieber Kristof,
Array soll nach dem Wert "d" des Subarrays sortiert werden.
Du suchst usort().
usort() verlangt einen Funktionsnamen als zweiten Parameter, eine Callback-Funktion. Diese Callback-Funktion bekommt traditionell zwei zu vergleichende Werte übermittelt und muss nun einen der folgenden Werte zurückliefern:
-1 : Der erste Wert ist kleiner als der zweite
0 : Die Werte sind gleich groß
1 : Der erste Wert ist größer als der zweite
In Deinem Fall könnte das so aussehen:
function vergleiche_d($arr1, $arr2) {
$wert1 = $arr1['d'];
$wert2 = $arr2['d'];
if ($wert1 < $wert2)
return -1;
if ($wert1 > $wert2)
return 1;
if ($wert1 == $wert2)
return 0;
}
$hat_geklappt = usort ($array, 'vergleiche_d');
Die Callback-Funktion kann man natürlich auch kürzer schreiben:
function vergleiche_d($arr1, $arr2) {
if ($arr1['d'] == $arr2['d'])
return 0;
return ($arr1['d'] < $arr2['d']) ? -1 : 1;
}
usort($array, 'vergleiche_d');
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Nachtrag:
Diese Callback-Funktion [...] muss nun einen der folgenden Werte zurückliefern:
-1 : Der erste Wert ist kleiner als der zweite
0 : Die Werte sind gleich groß
1 : Der erste Wert ist größer als der zweite
Das ist ungenau. Im ersten Falle muss der Wert lediglich kleiner als Null sein, es sind daher auch Werte wie -24.134 möglich.
Umgekehrt gilt analog dasselbe für den dritten Fall: Der Wert muss größer als Null sein.
Die Callback-Funktion kann man natürlich auch kürzer schreiben:
Unter den oben erwähnten Umständen geht es sogar ultrakurz:
function vergleiche_d($arr1, $arr2) {
return $arr2['d'] - $arr1['d'];
}
usort($array, 'vergleiche_d');
Liebe Grüße aus Ellwangen,
Felix Riesterer.