2017-06-14 5 views
1

Ich bin derzeit migrieren ein Projekt von php5.6 zu php7.1. Die meisten laufen gut, aber ich habe gerade einen Test an der Wand gemacht.usort Unterschied php7.1 vs php5.6

Die Funktion usort hat nicht das gleiche Verhalten in beiden Versionen, und es scheint nicht dokumentiert zu sein (es ist nicht so, dass zwei Werte gleich sind und dann ist die Reihenfolge nicht definiert). In meinem Testfall ist die zurückgegebene Array-Reihenfolge umgekehrt.

Hier ist eine Reproduktion des Problems. Beachten Sie, dass ich zurück -1 die ganze Zeit für eine Vereinfachung (Ich bin in der diff zwischen PHP5.6 und 7 hier Fokussierung)

-Code läuft auf beiden Versionen:

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

Ergebnisse in 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

Das ist, weil Ihr Callback-Funktionscode 'return -1;' ziemlich bedeutungslos ist, und völlig abhängig von der Reihenfolge, in der Einträge verglichen werden ..... Sie sollten diese Annahme nicht machen, aber sollte eine tatsächliche verwenden Vergleich in Ihrem Rückruf –

+0

Für alle Absichten und Zwecke ist die Reihenfolge Ihrer Artikel * undefined *; Sie können kein bestimmtes Ergebnis erwarten. – deceze

+1

sollten Sie die Vergleichsfunktion vollständig implementieren. –

Antwort

6

Der Grund dafür ist, dass in diesem Fall die Werte je nach PHP-Version in unterschiedlicher Reihenfolge an den usort() Callback übergeben werden.

https://3v4l.org/bW5WP

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

PHP 5.6 Ausgang:

VERGLEICH: b mit einem

PHP 7.x Ausgang:

VERGLEICH: eine mit b

Dies ist nicht wichtig für Rückrufe, die tatsächlich die angegebenen Werte vergleichen. Ihr Rückruf jedoch immer gibt -1 zurück, was bedeutet ersten Wert ist kleiner als der zweite Wert. In PHP 5.6 ergibt dies b als erstes in der Liste, in PHP 7.x wird a zuerst angezeigt.

Die Rückgabe inkonsistenter Ergebnisse aus dem Callback führt zu einem nicht definierten Verhalten, wenn Ihr Callback ein Array mit mehr als 2 Werten sortiert.

+0

Fair genug, das erklärt es. Vielen Dank! – haltabush

0

im PHP docs

Wenn zwei Mitglieder als gleich vergleichen, ist ihre relative Reihenfolge im sortierten Array undefiniert.

Auch es ist eine Inkonsistenz. See Here

+1

'-1' bedeutet nicht" gleich " – ShiraNai7