switch文のcaseによる条件分岐がおかしいとき

switch文で作成した条件の分岐がおかしく感じるときがあります。次の例は、「大吉」を引いたときのみ「大吉」と表示する簡単なswitch文です。

<?php
$a = 0;
switch ($a) {
    case "大吉":
        echo "入力値:{$a} 結果:大吉";
        break;
    default:
        echo "入力値:{$a} 結果:凶";
}
?>

入ってきた値は「0」ですが、実行すると、「大吉」と表示されてしまいます。

switch文の結果がおかしい

switch文の結果がおかしい

原因は、switch文のcaseの値比較が、データの型を考慮していないことです。「0」と「大吉」という型の違う値が比較されると、2つの値は同じ数値型に変換されて比較され、「大吉」は「0」だと評価されてしまうのです。

つまり、次のような型を考慮しないif文と同じ仕組みです。

<?php
$a = 0;
if (0 == "大吉") {
    echo "入力値:{$a} 結果:大吉";
}
?>
if文の条件分岐がおかしい

if文の条件分岐がおかしい

これに対処するには、case文で型まで比較する演算子「===」を使います。合わせて、switch文での比較対象を変数$aの代わりに「true」に置き換えます。これにより、「$a === "大吉"」がtrueの場合は「大吉」と表示するという条件分岐ができあがります。

<?php
$a = 0;
switch (true) {
    case $a === "大吉":
        echo "入力値:{$a} 結果:大吉";
        break;
    default:
        echo "入力値:{$a} 結果:凶";
}
?>
型まで比較するswitch文

型まで比較するswitch文

念のため確認すると、「大吉」と入力された場合は「大吉」と表示されます。

<?php
$a = "大吉";
switch (true) {
    case $a === "大吉":
        echo "入力値:{$a} 結果:大吉";
        break;
    default:
        echo "入力値:{$a} 結果:凶";
}
?>
修正したswitch文の結果

修正したswitch文の結果

PHPの基礎が身に付いたかチェックするなら

PHP「直す力」養成ドリル
スポンサーリンク