2017-06-14 114 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