คำสั่งวนรอบ ใช้สำหรับทำงานซ้ำๆ กัน ในภาษา PHP มีคำสั่งวนรอบทั้งหมด 4 คำสั่งคือ
- for
- while
- do while
- foreach
ส่วนประกอบของคำสั่งวนรอบจะมี 3 ส่วนใหญ่ๆ คือ
- ค่าเริ่มต้น (initialization)
- เงื่อนไขในการทำงาน (condition)
- คำสั่งเปลี่ยนค่า (update)
คำสั่งวนรอบ จะทำงานก็ต่อเมื่อเงื่อนไขยังคงเป็นจริง เพราะฉะนั้นเราต้องทำให้เงื่อนไขเป็นเท็จเพื่อให้จบการทำงานโดยการเปลี่ยนค่าไปเรื่อยๆ ถ้าหากไม่มีการจบเงื่อนไขโปรแกรมก็จะไม่จบการทำงาน ดังนั้นให้ระวังตรงนี้ด้วยนะครับ
for loop
เป็นเงื่อนไขที่เข้าใจได้ง่ายที่สุด เพราะมีการกำหนดค่า เงื่อนไข และเปลี่ยนแปลงค่า อยู่ภายในคำสั่งเดียวกันทั้งหมด มีรูปแบบการเขียน ดังนี้
<?php for ( initialization; condition; update ) { statement; } ?>
คำสั่ง for จะใช้มากในงานที่เรารู้จำนวนรอบการทำงานที่แน่นอน ตัวอย่างพิมพ์เลข 1 – 100
<?php for ($i = 1; $i <= 100; $i++ ) { echo $i . "<br />"; } ?>
ดูแล้ว เข้าใจไม่ยากเลยนะครับ ก็ถือว่าเป็นคำสั่งวนรอบที่ง่ายที่สุดแล้วล่ะครับ
while loop
เป็นเงื่อนไขที่เข้าใจยากขึ้นอีกนิด แต่ก็ใช้บ่อยมากพอสมควร while จะมีแต่การเช็คเงื่อนไขเพียงอย่างเดียว การกำหนดค่าเริ่มต้น จะทำก่อนที่จะเข้าเงื่อนไข และการอัพเดทค่าจะทำอยู่ภายในเงื่อนไข มีรูปแบบการเขียน ดังนี้
<?php initialization; while (condition) { statement; update; } ?>
จะเห็นว่า ส่วนประกอบ 3 ส่วนนั้นมีครบหมด while loop จะทำงานเมื่อเงื่อนไขยังเป็นจริง ถ้าหากเงื่อนไขเริ่มต้นเป็นเท็จแล้วก็จะไม่เข้าทำงานในส่วนของ while loop นี้เลย ลองดูตัวอย่างนะครับ
<?php $a = $b = $c = 5; // พิมพ์เลข 5 - 10 while ($a <= 10) { echo $a . "<br />"; $a++; } // ไม่หลุดลูปเนื่องจากไม่มีการอัพเดทค่า while ($b <= 10) { echo $b . "<br />"; // จะแสดงเลข 5 ออกมาเรื่อยๆ แต่โปรแกรมไม่หยุดทำงาน เนื่องจากเงื่อนไขยังคงเป็นจริง } // ไม่หลุดลูปเนื่องจากการอัพเดท ไม่ทำให้เงื่อนไขเป็นเท็จ while ($c <= 10) { echo $c . "<br />"; $c--; } // จะไม่ทำงาน เนื่องจากเงื่อนไขเริ่มต้นเป็นเท็จ while ($a < 10) { echo $a . "<br />"; $a++; // ไม่เข้ามาทำงาน เนื่องจากค่าของ $a = 11 จากลูปแรกแล้ว } ?>
โค๊ดตัวอย่างข้างบน ถ้าหากนำไปรัน ก็เตรียม end task ตัว browser ได้เลยนะครับ เพราะมันจะทำงานไม่หยุดเลย
จากตัวอย่าง ลูปสุดท้าย จะไ่ม่ทำงานนะครับ เนื่องจากค่าของ $a เป็น 11 ไปแล้ว หลังจากทำงานลูปแรกสุดเสร็จแล้ว เพราะฉะนั้น การใช้งาน while loop เราจำเป็นต้องตรวจสอบเงื่อนไขให้ดีก่อน ไม่เช่นนั้น โปรแกรมใน while loop ของเรา จะไม่มีวันทำงานเลย
do while loop
จากปัญหาที่ว่า ถ้าเงื่อนไขเป็นเท็จก่อนที่จะเริ่มลูป คำสั่งในนั้นจะไม่ทำงานเลย ก็เลยมี do while ออกมาเพื่อทำให้โปรแกรมในส่วนนั้นทำงานอย่างน้อยที่สุด 1 ครั้ง ไม่ว่าเงื่อนไขจะเป็นจริง หรือเท็จก็ตาม ทำให้การตรวจสอบเงื่อนไข ถูกย้ายไปไว้ด้านล่างสุดของลูป มีรูปแบบการเขียน ดังนี้
<?php initialization; do { statement; update } while (condition); ?>
ดูๆ แล้ว คล้ายกับ while loop เลยใช่ไหมครับ เพียงย้าย while ไปไว้ด้านล่างและมี do มาอยู่แทนที่ while เท่านั้นเอง งั้นลองดูที่โปรแกรมกันครับ
<?php $a = 10; // เงื่อนไขเป็นเท็จ ไม่ทำงานใน while while ($a < 10) { echo $a; $a++; } // เงื่อนไขเป็นเท็จ แต่ใช้ do while ซึ่งจะทำงานอย่างน้อย 1 ครั้ง do { echo $a; $a++; } while ($a < 10); ?>
while กับ do while นั้น อาจจะเข้าใจยากนิดหนึ่ง แต่ก็ไม่น่าจะยากเกินไปนะครับ ถ้าหากไม่เข้าใจ ก็ลองพยายามเขียนบ่อยๆ เดี๋ยวก็จะเข้าใจเองครับ
แล้วในเมื่อ for ก็ทำงานได้เหมือนกัน จะมี while มาทำไม?
สำหรับ for นั้น จะใช้สำหรับการทำงานที่รู้จำนวนรอบที่แน่นอน แต่สำหรับ while แล้ว จะใช้ร่วมกับฟังก์ชั่นที่คืนค่าเป็นจริงหรือเท็จกลับมา เช่นคำสั่ง mysql_fetch_assoc(); หรือ feof(); เป็นต้น เพราะเราไม่รู้ว่าจำนวนแถวที่ select มาได้มีทั้งหมดกี่แถว (คำสั่ง mysql_fetch_assoc) หรือว่าไฟล์ที่เรา้เปิดมาอ่านนั้นหมดหรือยัง (คำสั่ง feof)
ลองดูตัวอย่าง โค๊ดอ่านข้อความที่อยู่ในไฟล์ แล้วพิมพ์ออกมาที่หน้าจอครับ
<?php $fp = fopen("hello.txt", "r"); while (!feof($fp)) { echo fgets($fp); } fclose($fp); ?>
รูปผลลัพท์ที่ได้
จะเห็นได้ว่า เราไม่รู้ว่าไฟล์ของเรามีทั้งหมดกี่บรรทัด เราจึงใช้ while loop ทำการวนเพื่อให้นำข้อมูลออกมาทีละบรรทัดจนหมด ซึ่งการทำงานแบบนี้ ไม่สามารถใช้ for ได้ เพราะไฟล์ที่เปิดขึ้นมาแต่ละครั้ง อาจจะมีจำนวนบรรทัดที่ไม่เท่ากัน
สำหรับ do while บางภาษาอย่างเช่น Python ได้นำออกไปแล้ว เพราะไม่ค่อยได้ใช้งาน และหาโอกาสใช้งานจริงๆ จังๆ นั้น ยากมาก ส่วนตัวผม ก็ไม่เคยใช้งานจริงๆ เลยสักครั้งเดียว นอกจากเขียนให้ดูเป็นตัวอย่างนี่แหละครับ
foreach
ใช้ร่วมกับ Array สำหรับนำค่าออกมาได้เลย ซึ่งปกติในภาษาอื่นๆ (เช่นภาษา C) ถ้าหากต้องการเข้าถึงตัวแปร Array ต้องใช้คำสั่ง for แต่ในภาษา PHP และภาษาระดับสูงรุ่นใหม่ๆ จะมีคำสั่ง foreach สำหรับเข้าถึงค่าภายในตัวแปรได้เลย รูปแบบการเขียน foreach เขียนแบบนี้
<?php foreach ( array as $value ) { statement; } ?>
ลองมาดูตัวอย่าง และเปรียบเทียบกับคำสั่ง for เพื่อความเข้าใจที่มากขึ้นครับ
<?php $a = array("www.cmdevhub.com", "www.blognone.com", "www.pc-cm.com", "www.pantip.com"); // ใช้ for ในการเข้าถึงค่าในอาเรย์ for ( $i = 0; $i < count($a); $i++ ) { echo $a[$i]; echo "<br />"; } echo "<hr />"; // ใช้ foreach ในการเข้าถึงค่าในอาเรย์ foreach ( $a as $value ) { echo $value; echo "<br />"; } ?>
จากตัวอย่าง ถ้าลองเอาไปรันดู จะเห็นว่า ผลลัพท์ที่ได้จะเหมือนกันเลย เพื่อนๆ อาจจะเห็นว่า ใช้ for แล้ว ง่ายกว่าอีก แค่กำหนดขอบเขตการวนรอบโดยใช้ count เท่านั้นเอง ซึ่งมันก็จริง แต่ถ้าเป็นอาเรย์แบบจับคู่ล่ะ (associative) เราจะเข้าถึงข้อมูลทั้งหมดโดยใช้ for ได้อย่างไร ในเมื่อ index ไม่ใช่ตัวเลขแล้ว ลองดูตัวอย่างกันครับ
<?php $com = array("CPU" => "E8200", "RAM" => "2GB", "HDD" => "640GB", "VGA" => "9600GSO", "Monitor" => "Samsung 22\""); // Spec คอมที่เอาไว้เล่นเกมครับ // เราสามารถใช้ foreach ดึงข้อมูลออกมาได้แบบนี้ครับ foreach ( $com as $value ) { echo $value; echo "<br />"; } echo "<hr />"; // ถ้าต้องการนำ index ออกมาด้วย ก็เขียนรูปแบบนี้ครับ foreach ( $com as $key => $value ) { echo $key . " => " . $value; echo "<br />"; } ?>
เห็นไหมครับ แค่นี้ก็สามารถทราบข้อมูลทั้งหมดที่อยู่ภายใน Array แล้ว ทั้งแบบปกติ แล้วแบบจับคู่ แต่ถ้าแค่ต้องการรู้ค่าใน Array เฉยๆ ไม่ได้ไปวนลูปเพื่อเอาค่าไปใช้งาน ก็สามารถใช้คำสั่ง print_r() ก็ได้ครับ
<?php $com = array("CPU" => "E8200", "RAM" => "2GB", "HDD" => "640GB", "VGA" => "9600GSO", "Monitor" => "Samsung 22\""); // Spec คอมที่เอาไว้เล่นเกมครับ print_r($com); echo "<hr />"; echo "<pre>"; print_r($com); echo "</pre>"; ?>
คำสั่ง print_r() ถ้าหากไม่ใส่ <pre> ครอบเข้าไป จะได้ข้อความที่ต่อกันเป็นแถวเดียว ดูยากครับ แต่ถ้าใส่แล้ว จะสวยงาม ดูง่ายมากๆ ว่ามีค่าอะไรอยู่ข้างใน
ก็จบกันไปแล้วกับคำสั่งวนรอบ จริงๆ แล้วเราไม่จำเป็นต้องใช้ทุกคำสั่ง โดยเฉพาะ do while ที่ผมก็ไม่เคยใช้งานจริงเหมือนกัน แต่ for และ while ขอให้เน้นให้มากๆ ครับ ส่วน foreach ถ้าหากไม่ได้จริงๆ ก็ใช้ for แทนก็ได้ครับ แต่ถ้าเข้าใจแล้ว การเข้าถึงตัวแปร Array จะง่ายขึ้นอีกเยอะเลยครับ
เจอกันใหม่ในบทหน้านะครับ