Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
usort差异php7.1与php5.6_Php_Php 7 - Fatal编程技术网

usort差异php7.1与php5.6

usort差异php7.1与php5.6,php,php-7,Php,Php 7,我目前正在将一个项目从php5.6迁移到php7.1。大多数情况都很顺利,但我在考试中遇到了麻烦 函数usort在两个版本上的行为并不相同,而且似乎也没有文档记录(不是两个值相等,然后顺序未定义)。在我的测试用例中,返回的数组顺序是相反的 这是问题的再现。注意,为了简化,我一直返回-1(这里我将重点放在PHP5.6和7之间的差异上) 在两个版本上运行的代码: $a = [['value' => 1, 'toto' => 'toto'], ['value' => 1, 'toto

我目前正在将一个项目从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
        )

)
PHP7.1

Array
(
    [0] => Array
        (
            [value] => 1
            [toto] => toto
        )

    [1] => Array
        (
            [value] => 1
            [toto] =>
        )

)

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


这也是不一致的

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

PHP 5.6输出:

比较:b和a

PHP 7.x输出:

比较:a和b

这与实际比较给定值的回调无关。然而,您的回调总是返回
-1
,这意味着第一个值小于第二个值。在PHP5.6中,这将导致
b
在列表中位于第一位,而在PHP7.x中
a
将位于第一位


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

这是因为回调函数代码
return-1
毫无意义,完全取决于条目的比较顺序。。。。。你不应该做出这样的假设,但是应该在你的通话中使用一个实际的比较,因为所有的意图和目的,你的项目的顺序是未定义的;您不能期望任何特定的结果。您应该完全实现比较函数。@MarkBaker您的意思是以相同的方式对所有内容进行排序就等于返回0(根据文档)?如果您这样做,那么您可以看到PHP5使用回调与PHP7进行比较的顺序,您可以看到差异
–1
并不意味着“平等”足够公平,这就解释了这一点。谢谢
$array = ['a', 'b'];
usort($array, function ($firstValue, $secondValue) { echo "COMPARING: {$firstValue} with {$secondValue}\n"; return -1;});