PHP 7 中的 <=> (“宇宙飞船”运算符)是啥? [复制]

Posted

技术标签:

【中文标题】PHP 7 中的 <=> (“宇宙飞船”运算符)是啥? [复制]【英文标题】:What is <=> (the 'Spaceship' Operator) in PHP 7? [duplicate]PHP 7 中的 <=> (“宇宙飞船”运算符)是什么? [复制] 【发布时间】:2015-08-02 15:01:12 【问题描述】:

将于今年 11 月发布的 php 7 将引入 Spaceship () 运算符。它是什么以及它是如何工作的?

这个问题在我们关于 PHP 操作符的一般参考问题中已经有an answer。

【问题讨论】:

当前 PHP 版本是 PHP 5.x,PHP 7 可能是草稿,未来可以多次更改。 crazyengineers.com/threads/… wiki.php.net/rfc/combined-comparison-operator @panther PHP 7 是真实的,第一个候选版本将在几周内到期 - 尽管是否能满足该时间表还有待观察。可以看到计划的时间线here @pala_,要 google 一些东西,Google 必须首先“google it”并在某处找到“答案”。我用谷歌搜索并找到了这个页面,我对发布的这个问题没有意见。 【参考方案1】:

&lt;=&gt;(“Spaceship”)运算符将提供组合比较:

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 viz 当前使用的比较运算符相同。 &lt;&lt;===&gt;=&gt;。有 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

【讨论】:

但是字符串是如何比较的呢?它是否在查看字符、字符串中的字符数等等? @AltafHussain 看到这个答案:(***.com/a/17371819/4337069) 主要用于排序和组合比较。【参考方案2】:

根据the RFC that introduced the operator,$a &lt;=&gt; $b 的计算结果为:

0 如果$a == $b -1 如果$a &lt; $b 1 如果$a &gt; $b

在我尝试过的每种情况下,实践中似乎都是这种情况,尽管严格来说,official docs 仅提供稍弱的保证$a &lt;=&gt; $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'];
);

更多使用 spaceship 运算符编写的比较函数示例可以在 RFC 的 Usefulness 部分找到。

【讨论】:

对我来说,问题“是什么”不仅仅是“它有什么作用”,还有“它有什么用,在哪里可以看到”,因此我认为这是 正确而完整的答案:)【参考方案3】:

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

click here to know more

【讨论】:

Spaceship Operator 用于比较两个表达式。当第一个表达式分别小于、等于或大于第二个表达式时,它返回 -1、0 或 1。 nexladder.com/php7-tutorial/php7-spaceship-operator

以上是关于PHP 7 中的 <=> (“宇宙飞船”运算符)是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用宇宙飞船运算符按两个参数对数组进行排序[重复]

什么是 Ruby <=>(宇宙飞船)运算符?

三元运算符如何处理比较运算符(宇宙飞船运算符)

strcmp() 和 Spaceship Operator (<=>) 有啥区别

PHP实现删除数组中的特定元素

PHP实现删除数组中的特定元素