ข้อควรระวังในการใช้งาน switch case ของ PHP
มีผลลัพท์แปลกๆของ switch case มาฝาก ทำเอาผมมึนไปนานเลยทีเดียว
ดูจากโค้ด ผลลัพท์ ที่คาดหวังน่าจะเป็น one two three ใช่มั้ยครับ แต่ผลลัพท์เมื่อรันโค้ดนี้กลับเป็นแบบนี้
การแก้ไข ก่อนอื่น มาดูกันก่อนว่าในตัวแปร $a มีค่าอะไร (ทดสอบด้วย var_dump($a);)
ถ้าดูจากโค้ดด้านบนจะเห็นว่า ค่า $k ในรอบที่ 3 จะมีชนิดของตัวแปรเป็น integer (เลข 0) ซึ่งเมื่อนำไปเทียบกับ case แรกจะได้ว่า $k == (int)'one' ทำให้ได้ผลลัพท์เป็น true ใน case นี้ (PHP จะทำการแปลงชนิดของตัวแปรให้เป็นชนิดเดียวกันกับตัวแปรที่ใช้ทดสอบก่อนการเปรียบเทียบ)
การแก้ไข ให้ทำการแปลงตัวแปรที่ใช้ทดสอบให้เป็นชนิดเดียวกันก่อนเสมอ ตัวอย่างนี้คือ แปลง $k ให้เป็น string
$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;
}
}