我目前正在将一个项目从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);
PHP 5.6 的结果:
Array
(
[0] => Array
(
[value] => 1
[toto] =>
)
[1] => Array
(
[value] => 1
[toto] => toto
)
)
PHP 7.1
Array
(
[0] => Array
(
[value] => 1
[toto] => toto
)
[1] => Array
(
[value] => 1
[toto] =>
)
)
这样做的原因是,在这种情况下,根据 PHP 版本,值会以不同的顺序传递给
usort()
回调。
$array = ['a', 'b'];
usort($array, function ($firstValue, $secondValue) { echo "COMPARING: {$firstValue} with {$secondValue}\n"; return -1;});
PHP 5.6 输出:
比较:b 与 a
PHP 7.x 输出:
比较:a 与 b
这对于实际比较给定值的回调来说并不重要。然而,您的回调always返回
-1
,这意味着第一个值小于第二个值。在 PHP 5.6 中,这会导致 b
成为列表中的第一个,在 PHP 7.x 中,a
将成为第一个。
如果您的回调对超过 2 个值的数组进行排序,则从回调返回不一致的结果将导致未定义的行为。
也面临这个问题。 这应该适用于 php5 和 php7
# source: comment by jasdeep at sikher dot com in https://bugs.php.net/bug.php?id=69158
<?php
// https://3v4l.org/0sTAW
function test($firstValue, $secondValue) {
if ($firstValue > $secondValue) {
return 1;
}
if ($firstValue < $secondValue) {
return -1;
}
return 0;
}
$array = array('a', 'b', 'a', 'b', 'c');
usort($array, 'test');
echo print_r($array);