LoginSignup
4
0

More than 3 years have passed since last update.

少し奇妙なPHPの不等号

Posted at

ひょんな拍子に、PHPの不等号に関する恐ろしい事実を発見してしまいました。

まずは穴埋め

$a = ();
$b = ();

if($a < $b && $b < $a) {
  echo 'まさかこんなところには来ないよね';
}

実は、$a < $b && $b < $aという式を成立させてしまう方法が存在します。

配列の比較

ふつうの変数であれば比較基準は1通りなので、$a < $b && $b < $aなんていう事態に陥ることはないのですが、そうは問屋が卸さないのがPHPです。PHP標準で、配列にも比較基準を用意しています(PHPマニュアル)。

  • 配列の要素数が異なる場合、要素数が少ないほうが小さい
  • 要素数が同じ場合、キーを順に比較していって中身の大小で比較する(同じキーがなければ判定不能)

そして、PHPの連想配列はキーの順序が保存される、ということで、「同じキーがあるけど順番の違う」配列を用意して比較を行えば、パラレルワールドに突入です。

実際にやってみた

$a = ['foo' => 2, 'bar' => 5];
$b = ['bar' => 4, 'foo' => 3];

if($a < $b && $b < $a) {
  echo 'まさかこんなところには来ないよね';
}

3v4lでの実行結果

この場合、$a < $bではfooのキーが、$b < $aではbarのキーが先に比較されます。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0