[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

Reply via email to