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