ข้อควรระวังในการใช้งาน switch case ของ PHP

มีผลลัพท์แปลกๆของ switch case มาฝาก ทำเอาผมมึนไปนานเลยทีเดียว
$a = array('one' => 'one', 'two' => 'two', 'three');
foreach ($a as $k => $v) {
    switch ($k) {
        case 'one':
            echo 'one<br>';
            break;
        case 'two':
            echo 'two<br>';
            break;
        default:
            echo 'three<br>';
            break;
    }
}

ดูจากโค้ด ผลลัพท์ ที่คาดหวังน่าจะเป็น one two three ใช่มั้ยครับ แต่ผลลัพท์เมื่อรันโค้ดนี้กลับเป็นแบบนี้
one
two
one

การแก้ไข ก่อนอื่น มาดูกันก่อนว่าในตัวแปร $a มีค่าอะไร (ทดสอบด้วย var_dump($a);)
array (size=3)
'one' => string 'one' (length=3)
'two' => string 'two' (length=3)
0 => string 'three' (length=5)

ถ้าดูจากโค้ดด้านบนจะเห็นว่า ค่า $k ในรอบที่ 3 จะมีชนิดของตัวแปรเป็น integer (เลข 0) ซึ่งเมื่อนำไปเทียบกับ case แรกจะได้ว่า $k == (int)'one' ทำให้ได้ผลลัพท์เป็น true ใน case นี้ (PHP จะทำการแปลงชนิดของตัวแปรให้เป็นชนิดเดียวกันกับตัวแปรที่ใช้ทดสอบก่อนการเปรียบเทียบ)

การแก้ไข ให้ทำการแปลงตัวแปรที่ใช้ทดสอบให้เป็นชนิดเดียวกันก่อนเสมอ ตัวอย่างนี้คือ แปลง $k ให้เป็น string
foreach ($a as $k => $v) {
    switch ((string)$k) {
        case 'one':
            echo 'one<br>';
            break;
        case 'two':
            echo 'two<br>';
            break;
        default:
            echo 'three<br>';
            break;
    }
}
ผู้เขียน goragod โพสต์เมื่อ 28 พ.ย. 2558 เปิดดู 2,919 ป้ายกำกับ PHP
^