2017-06-14 55 views
1

我目前正在将一个项目从php5.6迁移到php7.1。大多数进展顺利,但我只是在一个测试中碰壁。usort差异php7.1 vs php5.6

函数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] => 
     ) 

) 
+2

这是因为你的回调函数代码'return -1;'是非常没有意义的,完全服从条目的比较顺序.....你不应该做出这样的假设,而应该使用一个实际的在您的回调中比较 –

+0

对于所有意图和目的,您的物品的订单是* undefined *;你不能指望任何特定的结果。 – deceze

+1

你应该完全实现比较功能。 –

回答

6

原因是在这种情况下,值根据PHP版本以不同的顺序传递给usort()回调。

https://3v4l.org/bW5WP

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

PHP 5.6输出:

COMPARING:B,其中A

PHP 7.x的输出:

COMPARING:一个用b

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

如果您的回调对多于2个值的数组进行排序,则从回调中返回incosistent结果将导致未定义的行为。

+0

够公平的,这就解释了它。谢谢! – haltabush

0

PHP docs

如果两个成员比较相等,则它们在排序的 数组中的相对顺序未定义。

另外它是不一致的。 See Here

+1

'-1'并不意味着“相等” – ShiraNai7