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