我目前正在将项目从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)
原因是在这种情况下,值会以usort()不同的顺序传递给回调,具体取决于PHP版本.
$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个值的数组,则返回来自回调的不存在的结果将导致未定义的行为.