[EMAIL PROTECTED] wrote: > ID: 19259 > Updated by: [EMAIL PROTECTED] > -Summary: usort() leaves array unsorted > Reported By: [EMAIL PROTECTED] > -Status: Closed > +Status: Critical > Bug Type: Arrays related > -Operating System: OSF1 V4.0 1229 > +Operating System: OSF1 V4.0 > -PHP Version: 4.2.2 > +PHP Version: 4.3.0 RC1 [...] > ---- EXPECTED OUTPUT > -- Testing arsort() -- > No second argument: > array(8) { > ["-2147483647"]=> > array(2) { > [0]=> > string(6) "banana" > [1]=> > string(6) "orange" > } > ["test"]=> > int(27) > [2147483647]=> > string(4) "test" > [-2147483648]=> > string(6) "monkey" [...] > ---- ACTUAL OUTPUT > -- Testing arsort() -- > No second argument: > array(8) { > ["-2147483647"]=> > array(2) { > [0]=> > string(6) "banana" > [1]=> > string(6) "orange" > } > ["test"]=> > int(27) > [2147483647]=> > string(4) "test" > [2147483648]=> > string(6) "monkey"
These test results scared me as well, but it looks like this array test itsself is flawed: it relies on the fact that integers automatically wrap around to negative values at INT_MAX (=2147483647 on 32 bit machines). Have a look at the unsorted data in data.inc: On Linux/Intel (32 bit integers): # sapi/cli/php -r 'include("ext/standard/tests/array/data.inc"); var_dump($data);' array(8) { [0]=> string(3) "PHP" [17]=> string(27) "PHP: Hypertext Preprocessor" [5]=> string(4) "Test" ["test"]=> int(27) [2147483647]=> string(4) "test" ["-2147483647"]=> array(2) { [0]=> string(6) "banana" [1]=> string(6) "orange" } [-2147483648]=> string(6) "monkey" [16777216]=> float(-0.33333333333333) } On Tru64/Alpha (64 bit integers): # sapi/cli/php -r 'include("ext/standard/tests/array/data.inc"); var_dump($data);' Unaligned access pid=156100 <php> va=0x1400510cc pc=0x12019ab50 ra=0x12019ab44 inst=0xb4010000 Unaligned access pid=156100 <php> va=0x14005272c pc=0x12019ab50 ra=0x12019ab44 inst=0xb4010000 array(8) { [0]=> string(3) "PHP" [17]=> string(27) "PHP: Hypertext Preprocessor" [5]=> string(4) "Test" ["test"]=> int(27) [2147483647]=> string(4) "test" ["-2147483647"]=> array(2) { [0]=> string(6) "banana" [1]=> string(6) "orange" } [2147483648]=> string(6) "monkey" [16777216]=> float(-0.33333333333333) } The difference is in the key of the "monkey" element: it should be 2147483647+1, but on 32 bit machines, this number is automatically wrapped and so it results in -2147483648. On 64 bit machines, 2147483647+1 correctly results in +2147483648, so it's impossible to get the expected result there. Regards... Michael -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php