usort差异php7.1 vs php5.6

hal*_*ush 2 php php-7

我目前正在将项目从php5.6迁移到php7.1.大多数情况进展顺利,但我只是在墙上进行了一次测试.

函数usort在两个版本上都没有相同的行为,并且它似乎没有记录(不是两个值是等于,然后顺序是未定义的).在我的测试用例中,返回的数组顺序是相反的.

这是问题的再现.请注意,我一直返回-1以简化(我在这里专注于PHP5.6和7之间的差异)

代码在两个版本上运行:

$a = [['value' => 1, 'toto' => 'toto'], ['value' => 1, 'toto' => null]];
usort($a, function ($a, $b) { return -1;});
print_r($a);
Run Code Online (Sandbox Code Playgroud)

PHP 5.6中的结果:

Array
(
    [0] => Array
        (
            [value] => 1
            [toto] =>
        )

    [1] => Array
        (
            [value] => 1
            [toto] => toto
        )

)
Run Code Online (Sandbox Code Playgroud)

PHP 7.1

Array
(
    [0] => Array
        (
            [value] => 1
            [toto] => toto
        )

    [1] => Array
        (
            [value] => 1
            [toto] =>
        )

)
Run Code Online (Sandbox Code Playgroud)

Shi*_*ai7 7

原因是在这种情况下,值会以usort()不同的顺序传递给回调,具体取决于PHP版本.

https://3v4l.org/bW5WP

$array = ['a', 'b'];
usort($array, function ($firstValue, $secondValue) { echo "COMPARING: {$firstValue} with {$secondValue}\n"; return -1;});
Run Code Online (Sandbox Code Playgroud)

PHP 5.6输出:

比较:b与a

PHP 7.x输出:

比较:a与b

这与实际比较给定值的回调无关.然而,您的回调总是返回-1,这意味着第一个值小于第二个值.在PHP 5.6中,这导致b列表中的第一个,在PHP 7.x a中将是第一个.

如果回调正在排序超过2个值的数组,则返回来自回调的不存在的结果将导致未定义的行为.