phpbar.de logo

Mailinglisten-Archive

[php] asort und der Bärendienst von PHP

[php] asort und der Bärendienst von PHP

Peter Bieling net2 at media-palette.de
Mon Okt 9 11:08:38 CEST 2006


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