switch文で作成した条件の分岐がおかしく感じるときがあります。次の例は、「大吉」を引いたときのみ「大吉」と表示する簡単なswitch文です。
<?php
$a = 0;
switch ($a) {
case "大吉":
echo "入力値:{$a} 結果:大吉";
break;
default:
echo "入力値:{$a} 結果:凶";
}
?>
入ってきた値は「0」ですが、実行すると、「大吉」と表示されてしまいます。

switch文の結果がおかしい
原因は、switch文のcaseの値比較が、データの型を考慮していないことです。「0」と「大吉」という型の違う値が比較されると、2つの値は同じ数値型に変換されて比較され、「大吉」は「0」だと評価されてしまうのです。
つまり、次のような型を考慮しないif文と同じ仕組みです。
<?php
$a = 0;
if (0 == "大吉") {
echo "入力値:{$a} 結果:大吉";
}
?>

if文の条件分岐がおかしい
これに対処するには、case文で型まで比較する演算子「===」を使います。合わせて、switch文での比較対象を変数$aの代わりに「true」に置き換えます。これにより、「$a === “大吉”」がtrueの場合は「大吉」と表示するという条件分岐ができあがります。
<?php
$a = 0;
switch (true) {
case $a === "大吉":
echo "入力値:{$a} 結果:大吉";
break;
default:
echo "入力値:{$a} 結果:凶";
}
?>

型まで比較するswitch文
念のため確認すると、「大吉」と入力された場合は「大吉」と表示されます。
<?php
$a = "大吉";
switch (true) {
case $a === "大吉":
echo "入力値:{$a} 結果:大吉";
break;
default:
echo "入力値:{$a} 結果:凶";
}
?>

修正したswitch文の結果
