PHP 7中的<=>("飞船"操作符)是什么?

271

PHP 7引入了太空船(<=>)运算符,它是什么以及如何使用?


https://wiki.php.net/rfc/combined-comparison-operator - M.P. Korstanje
1
尽管PHP 7.0的功能发布说明中提到“当$a分别小于、等于或大于$b时,返回-1、0或1”,但长期以来的比较运算符文档对此并不是那么具体:“当$a分别小于、等于或大于$b时,返回一个小于、等于或大于零的整数”,幸运的是,排序函数正是期望它是这样的。 - undefined
3个回答

355
"<=>"("太空船")运算符将提供组合比较,它将:
Return 0 if values on either side are equal
Return 1 if the value on the left is greater
Return -1 if the value on the right is greater

综合比较运算符使用的规则与PHP当前使用的比较运算符相同,即<<===>=>。那些有Perl或Ruby编程背景的人可能已经对这个为PHP7提出的新运算符很熟悉了。
   //Comparing Integers

    echo 1 <=> 1; //output  0
    echo 3 <=> 4; //output -1
    echo 4 <=> 3; //output  1
    
    //String Comparison
    
    echo "x" <=> "x"; //output  0
    echo "x" <=> "y"; //output -1
    echo "y" <=> "x"; //output  1

当你以这种方式比较字符串时,它会从左到右逐个比较给定字符串中的每个字符,以查看它们是否不同,直到找到一个差异。然后,通过比较最后一个字符的ASCII值来决定哪个字符串更大。

16
字符串是如何进行比较的?它是否逐个字符进行比较,还是比较字符串中字符的数量等内容? - Altaf Hussain
4
@AltafHussain,请查看这个答案:(https://dev59.com/AHPYa4cB1Zd3GeqPoOH3#17371819) - Krzysztof Karski
1
它可以主要用于排序和组合比较。 - Raju
1
记忆规则:-1 < 0 > 1 - Max Lipsky

89
根据引入该运算符的RFC$a <=> $b的计算结果如下:
  • 如果$a == $b,则为0
  • 如果$a < $b,则为-1
  • 如果$a > $b,则为1
在我尝试的每种情况下,这似乎都是实践中的情况,尽管官方文档仅提供了稍微弱一些的保证,即$a <=> $b将返回

$a分别小于、等于或大于$b时,返回小于零、等于零或大于零的整数

无论如何,为什么你想要这样的运算符呢?RFC解释了这个问题 - 它基本上完全是为了使编写usort(以及类似的uasortuksort)比较函数更加方便。

usort将一个数组作为第一个参数进行排序,并将用户定义的比较函数作为其第二个参数。它使用该比较函数来确定数组中一对元素中哪个更大。比较函数需要返回:

如果第一个参数被认为小于、等于或大于第二个参数,则分别返回小于零、等于零或大于零的整数。

太空船运算符使得这变得简洁而方便:

$things = [
    [
        'foo' => 5.5,
        'bar' => 'abc'
    ],
    [
        'foo' => 7.7,
        'bar' => 'xyz'
    ],
    [
        'foo' => 2.2,
        'bar' => 'efg'
    ]
];

// Sort $things by 'foo' property, ascending
usort($things, function ($a, $b) {
    return $a['foo'] <=> $b['foo'];
});

// Sort $things by 'bar' property, descending
usort($things, function ($a, $b) {
    return $b['bar'] <=> $a['bar'];
});

更多使用太空船操作符编写的比较函数示例可以在 RFC 的 Usefulness 部分中找到。

12
对我来说,“什么是”这个问题不仅仅是“它是做什么的”,还包括“它有什么用途,在哪里可以看到”,因此我认为这是正确而完整的答案 :) - jave.web

3
这是一种新的组合比较运算符。与strcmp()或version_compare()类似,但它可以用于所有通用PHP值,并具有与<<===>=>相同的语义。如果两个操作数相等,则返回0,如果左侧大,则返回1,如果右侧大,则返回-1。它使用与我们现有的比较运算符完全相同的比较规则:<<===>=>

点击此处了解更多信息


1
太空船运算符用于比较两个表达式。当第一个表达式分别小于、等于或大于第二个表达式时,它返回-1、0或1。https://nexladder.com/php7-tutorial/php7-spaceship-operator - Viju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接