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()andを使用しようとすることに似ています。stricmp()

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

比較演算子で配列を使用するための規則は、ここに示されています (さまざまな型との比較というラベルの付いた表まで下にスクロールします)。配列を別の配列と比較するときのルールは次のとおりです。

オペランド 1 のキーがオペランド 2 に見つからない場合、配列は比較できません。それ以外の場合は、値ごとに比較します。

配列を別の型と比較すると、配列の方が常に大きくなります。そう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. 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. 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. 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

序章

宇宙船演算子 <=>は、等値演算子 ( 、、、 )と同じ優先順位を持つ非結合二項演算子です。==!====!==

この演算子の目的は、左側のオペランドと右側のオペランドの間の単純な 3 者間比較を可能にすることです。


考えられる結果

演算子は、次のいずれかの結果を生成できます。

  • 0: 両方のオペランドが等しい場合
  • -1: 左側のオペランドが右側のオペランドより小さい場合
  • 1: 左側のオペランドが右側のオペランドより大きい場合。

つまり、次のことを意味します。

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

実用化

この演算子を実際に使用する適切なアプリケーションは、2 つの値の 3 者間比較に基づいてゼロ、負、または正の整数を返すことが期待される比較型のコールバックです。に渡される比較関数は、usortそのような例の 1 つです。

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 に答える