web-dev-qa-db-ja.com

PHP 7の<=>( 'Spaceship'演算子)とは何ですか?

今年11月に登場する予定のPHP 7では、Spaceship(<=>)演算子が導入されます。それは何ですか、そしてそれはどのように機能しますか?

この質問はすでにPHP演算子についての一般的な参照質問に 回答 を持っています。

160
Deepak Mankotia

この<=>演算子は、以下の点で組み合わせ比較を提供します。

Return 0 if values on either side are equal
Return 1 if value on the left is greater
Return -1 if the value on the right is greater

組み合わせ比較演算子で使用される規則は、PHP vizで現在使用されている比較演算子と同じです。 <<===>=および>。 PerlまたはRubyプログラミングのバックグラウンドを持っている人は、PHP7用に提案されたこの新しい演算子に既に精通しているかもしれません。

   //Comparing Integers

    echo 1 <=> 1; //ouputs 0
    echo 3 <=> 4; //outputs -1
    echo 4 <=> 3; //outputs 1

    //String Comparison

    echo "x" <=> "x"; // 0
    echo "x" <=> "y"; //-1
    echo "y" <=> "x"; //1
222
GreenROBO

演算子を導入したRFC によると、$a <=> $bは次のように評価されます。

  • $a == $bの場合は0
  • -1 if $a < $b
  • $a > $bの場合1

厳密には official docs$a <=> $bが返されるというわずかに弱い保証しか提供していませんが、実際に私が試したすべてのシナリオでそうです

$aがそれぞれ$bより小さい、等しい、または大きい場合、ゼロより小さい、等しい、または大きい整数

とにかく、なぜあなたはそのような演算子が必要なのでしょうか?繰り返しになりますが、RFCはこれに対処しています- usort (および同様の uasort および uksort の比較関数を記述する方が便利です。 )。

usortは、配列を最初の引数として並べ替え、ユーザー定義の比較関数を2番目の引数として受け取ります。この比較関数を使用して、配列の要素のペアのどちらが大きいかを判断します。比較関数は以下を返す必要があります。

最初の引数がそれぞれ2番目の引数より小さい、等しい、または大きいと見なされる場合は、ゼロより小さい、等しい、または大きい整数。

宇宙船オペレーターは、この簡潔で便利なものにします:

$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の 有用性 セクションにあります。

50
Mark Amery

組み合わせ比較のための新しい演算子です。動作はstrcmp()またはversion_compare()に似ていますが、<<===>=>と同じ意味を持つすべての総称PHP値に使用できます。両方のオペランドが等しい場合は0、左が大きい場合は1、右が大きい場合は-1を返します。これは、既存の比較演算子<<===>=および>とまったく同じ比較規則を使用します。

詳細はここをクリック