Mee's Engineer Blog

PHPエンジニアの技術ブログ

switch文で文字列を比較対象にする際の注意点

PHPのswitch文は比較を「==」で行っています。
従って、比較対象を文字列にした場合想定外の動作が起こります。

<?php
$arr = array('怠惰', 'ゼロ', 0);

foreach ($arr as $val) {
    switch ($val) {
        case '怠惰':
            echo $val . ' → 怠惰ですねぇ' . '<br>';
            break;
        default :
            break;
    }
}

// 出力結果
怠惰 → 怠惰ですねぇ
0 → 怠惰ですねぇ

このようになってしまうので、文字列を比較対象とする場合は
下のいずれかの対応を行う事で意図しない不具合を回避することができます。

方法1

<?php
$arr = array('怠惰', 'ゼロ', 0);

foreach ($arr as $val) {
    switch ((string)$val) {
        case '怠惰':
            echo $val . ' → 怠惰ですねぇ' . '<br>';
            break;
        default :
            break;
    }
}

// 出力結果
怠惰 → 怠惰ですねぇ

方法2

<?php
$arr = array('怠惰', 'ゼロ', 0);

foreach ($arr as $val) {
    switch (true) {
        case $val === '怠惰':
            echo $val . ' → 怠惰ですねぇ' . '<br>';
            break;
        default :
            break;
    }
}

// 出力結果
怠惰 → 怠惰ですねぇ