Help us understand the problem. What is going on with this article?

少し奇妙なPHPの不等号

ひょんな拍子に、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のキーが先に比較されます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした