rukurxの日記

自分の日々の作業や調べたことのメモ

PHP7で追加されたスペースシップ演算子(<=>)について

PHPのコードレビューをしていたら見慣れない演算子 <=> を発見!

なんやこれと思ったら、PHP7で追加された スペースシップ演算子(spaceship operator) という比較演算子でした。

スペースシップ演算子は左辺と右辺を比較した結果として、-1, 0, 1 のいずれかを返します。

  • 左辺より右辺が大きければ -1 を返す。
  • 左辺の右辺が同じなら 0 を返す。
  • 左辺の方が右辺より 1 を返す。

PHPインタラクティブモードで実際に返却される値を確認する。

$ php -a
Interactive shell

php > // 数値比較
php > echo 0 <=> 1;
-1
php > echo 1 <=> 1;
0
php > echo 1 <=> 0;
1
php > // trueとfalse比較(trueは1, falseは'')
php > echo false <=> true;
-1
php > echo true <=> true;
0
php > echo true <=> false;
1
php > // 文字列比較(アルファベット順)
php > echo 'a' <=> 'b';
-1
php > echo 'a' <=> 'a';
0
php > echo 'b' <=> 'a';
1

どうやらソートする際によく使われる様子。

  • 今までの書き方
<?php

  $numbers = [5, 1, 3, 2, 4];

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

  print_r($numbers);
  • スペースシップ演算子を使った場合
<?php

  $numbers = [5, 1, 3, 2, 4];

  usort($numbers, function($a, $b) {
    return $a <=> $b;
  });

  print_r($numbers);

スペースシップ演算子自体はPerlRubyなどの他の言語にもあるみたいですね。他の言語もやらないと…

参考

stackoverflow.com qiita.com www.sitespiral.jp