usort php7.1 与 php5.6 的区别

问题描述 投票:0回答:3

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

)

PHP 7.1

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

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

)
php php-7
3个回答
9
投票

这样做的原因是,在这种情况下,根据 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 输出:

比较:b 与 a

PHP 7.x 输出:

比较:a 与 b

这对于实际比较给定值的回调来说并不重要。然而,您的回调always返回

-1
,这意味着第一个值小于第二个值。在 PHP 5.6 中,这会导致
b
成为列表中的第一个,在 PHP 7.x 中,
a
将成为第一个。

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


0
投票

PHP 文档中

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

这也是一种不一致。 看这里


0
投票

也面临这个问题。 这应该适用于 php5 和 php7

# source: comment by jasdeep at sikher dot com in https://bugs.php.net/bug.php?id=69158
<?php

// https://3v4l.org/0sTAW

function test($firstValue, $secondValue) {
    if ($firstValue > $secondValue) {
        return 1;
    }
    if ($firstValue < $secondValue) {
        return -1;
    }
    return 0;
}
$array = array('a', 'b', 'a', 'b', 'c');
usort($array, 'test');
echo print_r($array);
© www.soinside.com 2019 - 2024. All rights reserved.