2

在途中查看 php 7,但 <=> 让我感到困惑。

大多数情况下,我使用条件运算符,它们用于布尔情况(<=> 几乎是,但不完全是,也能够返回 -1)。(如果 X <=> Y)。所以我不确定在以下情况下会发生什么......

if ($x <=> $y) {
    // Do all the 1 things
} else {
    // Do all the 2 things
}

如果前面有...我能期待什么

$x = 0; $y = 1;

或者

$x = "Carrot"; $y = "Carrot Juice";

或者

$x = "Carrot Juice"; $y = "Carrot";

或者

$x = array(carrot, juice); $y = "carrot juice";

肯定有足够多的案例让我对它会做什么感到困惑。

4

3 回答 3

7

spaceship 运算符(和其他 PHP 7 新增功能)在此处以通俗易懂的语言解释:

https://blog.engineyard.com/2015/what-to-expect-php-7

它在提供给usort.

// Pre PHP 7
function order_func($a, $b) {
    return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}

// Post PHP 7
function order_func($a, $b) {
    return $a <=> $b;
}

在 中用处不大if,因为if只检查值是真还是假,表示排序的不同真值是不区分的。如果您确实在布尔上下文中使用它,那么true当值不同时(因为1并且-1很麻烦),false当它们相等时(因为0是错误的),将考虑它。这类似于尝试在布尔上下文中使用strcmp()stricmp(),这就是您经常看到的原因

if (stricmp($x, $y) == 0)

此处给出了使用带有比较运算符的数组的规则(向下滚动到标有“与各种类型的比较”的表)。将一个数组与另一个数组进行比较时,规则是:

成员较少的数组较小,如果在操作数 2 中找不到来自操作数 1 的键,则数组不可比较,否则 - 按值比较

将数组与另一种类型进行比较时,数组总是更大。array('carrot', 'juice') <=> 'carrot juice'也会如此1

于 2015-09-16T21:07:26.947 回答
2

为什么不亲自尝试一下,然后玩弄你得到的那艘新宇宙飞船呢?

Demo

此外,如果您想知道宇宙飞船运算符的比较是如何工作的,请参阅: http: //php.net/manual/en/types.comparisons.php


但是现在,如果我们想更详细地了解您的测试数据:

  1. 第一种情况:

    //Test data
    $x = 0;
    $y = 1;
    

    //operator
    0 <=> 1 //0 is smaller than 1, so result: -1
    //-1 evaluates to TRUE in the if statement
    
  2. 第二种情况:

    //Test data
    $x = "Carrot";
    $y = "Carrot Juice";
    

    //operator
    "Carrot" <=> "Carrot Juice" //"Carrot" is smaller than "Carrot Juice", so result: -1
    //-1 evaluates to TRUE in the if statement
    
  3. 第三种情况:

    //Test data
    $x = "Carrot Juice";
    $y = "Carrot";
    

    //operator
    "Carrot Juice" <=> "Carrot" //"Carrot Juice" is bigger than "Carrot", so result: 1
    //1 evaluates to TRUE in the if statement
    
  4. 第四种情况:

    //Test data
    $x = array("carrot", "juice");
    $y = "carrot juice";
    

    //operator
    array("carrot", "juice") <=> "carrot juice" //array("carrot", "juice") is bigger than "carrot juice", so result: 1
    //1 evaluates to TRUE in the if statement
    
于 2015-09-16T20:54:53.553 回答
1

介绍

spaceship 运算符 <=>是非关联二元运算符,其优先级与等式运算符 ( ==, !=, ===, !==) 相同。

该运算符的目的是允许在左侧和右侧操作数之间进行更简单的三向比较。


可能的结果

操作员可以产生以下任何结果:

  • 0: 当两个操作数相等时
  • -1: 当左侧操作数小于右侧操作数时
  • 1: 当左侧操作数大于右侧操作数时。

所以,这意味着:

1 <=> 1; // output : 0
1 <=> 2; // output : -1
2 <=> 1; // output : 1

实际应用

使用此运算符的一个很好的实际应用是比较类型的回调,该回调预计基于两个值之间的三向比较返回零、负或正整数。传递给的比较函数usort就是这样一个例子。

在 PHP 7 之前,你会这样写:

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    if ($a < $b) {
        return -1;
    } elseif ($a > $b) {
        return 1;
    } else {
        return 0;
    }
});

从 PHP 7 开始,你可以这样写:

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    return $a <=> $b;
});
于 2016-01-18T05:53:03.970 回答