ひょんな拍子に、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 'まさかこんなところには来ないよね';
}
この場合、$a < $b
ではfoo
のキーが、$b < $a
ではbar
のキーが先に比較されます。