Mailinglisten-Archive |
Hallo zusammen,
in einem Skript ist folgendes Problem mit asort aufgetreten, das ich
zwar lösen konnte, das ich euch aber mal schildern möchte, um euch vor
ähnlichen Fallstricken zu bewahren.
Ein Array mit Lagerorten soll sortiert werden. Die Indexe werden noch
gebraucht, daher asort:
$arr = array();
$arr[] = '20e140';
$arr[] = '20c170';
$arr[] = '30e136';
$arr[] = '30e135';
asort($arr);
//oder: asort($arr, SORT_REGULAR);
reset ($arr); //hat keinen Einfluss,
//stand aber so im Manual
while (list ($key, $val) = each ($arr)) {
echo "$key = $val\n";
}
//Ausgabe (PHP4/PHP5.1.6) (falsch):
1 = 20c170
3 = 30e135
2 = 30e136
0 = 20e140
Das gleiche mit
asort($arr, SORT_STRING);
//Ausgabe (richtig)
1 = 20c170
0 = 20e140
3 = 30e135
2 = 30e136
Ein Test mit asort($arr, SORT_NUMERIC);
ergibt, dass hier genauso sortiert wird, wie mit SORT_REGULAR. Dennoch
wollte mir nicht in den Kopf, warum 20e140 nach 30e136 kommt. Was ist
Regular und wie und warum wird hier nummerisch sortiert?
Das legte die Idee nahe, mal zu jedem String 0 hinzuzuaddieren:
1 = 20
3 = 3E+136
2 = 3E+137
0 = 2E+141
Großes Erstaunen - und siehe da, es steht ja auch im Manual:
"Der String wird als float ausgewertet, wenn er eines der Zeichen '.',
'e' oder 'E' enthält. Ansonsten wird er als Integer-Wert interpretiert."
Ein netter Bärendienst von PHP. Kann mir jemand sagen, wo diese
automatische Konvertierung von String in Float Sinn macht?
Um mal mit Günter Netzer zu sprechen: "So etwas gehört abgestellt!" ;-(
Viele Grüße
Peter
php::bar PHP Wiki - Listenarchive