switch文で作成した条件の分岐がおかしく感じるときがあります。次の例は、「大吉」を引いたときのみ「大吉」と表示する簡単なswitch文です。
<?php $a = 0; switch ($a) { case "大吉": echo "入力値:{$a} 結果:大吉"; break; default: echo "入力値:{$a} 結果:凶"; } ?>
入ってきた値は「0」ですが、実行すると、「大吉」と表示されてしまいます。
原因は、switch文のcaseの値比較が、データの型を考慮していないことです。「0」と「大吉」という型の違う値が比較されると、2つの値は同じ数値型に変換されて比較され、「大吉」は「0」だと評価されてしまうのです。
つまり、次のような型を考慮しないif文と同じ仕組みです。
<?php $a = 0; if (0 == "大吉") { echo "入力値:{$a} 結果:大吉"; } ?>
これに対処するには、case文で型まで比較する演算子「===」を使います。合わせて、switch文での比較対象を変数$aの代わりに「true」に置き換えます。これにより、「$a === “大吉”」がtrueの場合は「大吉」と表示するという条件分岐ができあがります。
<?php $a = 0; switch (true) { case $a === "大吉": echo "入力値:{$a} 結果:大吉"; break; default: echo "入力値:{$a} 結果:凶"; } ?>
念のため確認すると、「大吉」と入力された場合は「大吉」と表示されます。
<?php $a = "大吉"; switch (true) { case $a === "大吉": echo "入力値:{$a} 結果:大吉"; break; default: echo "入力値:{$a} 結果:凶"; } ?>