คำสั่งวนซ้ำ

28 December 2016

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับคำสั่งวนซ้ำในภาษา PHP ซึ่งประกอบไปด้วยคำสั่ง While Do While และ For loop ซึ่งเป็นคำสั่งที่ใช้ในการควบคุมโปรแกรมให้ทำงานในรูปแบบที่ซ้ำๆ ภายใต้เงือนไขที่เปลี่ยนไป

ในชีวิตประจำวัน เรามักจะเจอกับสิ่งที่เกิดขึ้นซ้ำๆ ในวิธีการหรือกระบวนการแบบเดิม ยกตัวอย่างเช่น ในตอนเช้าของทุกๆ วันคุณเดินทางไปทำงาน หรือพนักงานขายอาหาร พวกเขาต้องรับรายการอาหาร แล้วจึงไปทำอาหาร จนถึงนำมาให้บริกาลูกค้า ซึ่งในแต่ละวันอาจจะมีลูกค้าเป็นร้อยหรือพันคน ซึ่งพวกเขารับมือกับลูกค้าในวิธีเดียวกัน

ในการเขียนโปรแกรม การวนซ้ำนั้นเป็นสิ่งที่สำคัญในการที่จะทำให้โปรแกรมสามารถทำงานด้วยคำสั่งเดิมได้อย่างมีประสิทธิภาพ ยกตัวอย่าง เช่น การแสดงรายชื่อของสมาชิกของเว็บไซต์จำนวน 20 คน นี่เป็นตัวอย่างที่ต้องใช้คำสั่งวนซ้ำในการจัดการ โดยมีแนวคิดที่ว่าเมื่อคุณสามารถแสดงข้อมูลของสมาชิกคนแรกได้แล้ว คนต่อไปก็สามารถทำในแบบเดียวกันได้

เราจะมาเริ่มกับคำสั่งวนซ้ำที่พื้นฐานที่สุดในภาษา PHP ซึ่งก็คือคำสั่ง While loop

คำสั่ง while loop

คำสั่ง While loop คือคำสั่งวนซ้ำที่พื้นฐานที่สุดในภาษา PHP มันใช้สำหรับควบคุมการทำงานของโปรแกรมให้ทำงานซ้ำๆ ภายใต้เงือนไขที่กำหนด นี่เป็นรูปแบบของการใช้งานคำสั่ง While loop ในภาษา PHP

while (expression)
    statements

ในการทำงานของคำสั่ง While loop จะทำงานในขณะที่ expression เป็นจริง ซึ่ง statements เป็นคำสั่งภายในบล็อคของ While loop ที่อาจจะประกอบไปด้วยหนึ่งหรือหลายคำสั่ง มาดูตัวอย่างการใช้งานคำสั่ง While loop ในภาษา PHP

<?php

$i = 1;

while ($i <= 10) {
    echo "$i\n";
    $i++;
}

?>

ในตัวอย่างเป็นการใช้คำสั่ง While loop ในการแสดงผลตัวเลขจาก 1 - 10 ตัวแปร $i เป็นตัวแปรกำหนดค่าเริ่มต้นในการทำงาน และ $i <= 10 เป็นเงือนไขของคำสั่งวนซ้ำ ซึ่งหมายความว่าโปรแกรมจะทำงานในบล็อคของคำสั่งถ้าหากค่าของ $i น้อยกว่าหรือเท่ากับ 10 ในบล็อคของคำสั่ง While loop เราแสดงผลตัวเลขและเพิ่มค่า $i ในแต่ละรอบ

1
2
3
4
5
6
7
8
9
10

นี่เป็นผลลัพธ์ของโปรแกรม ซึ่งเราได้แสดงตัวเลข 1 - 10 ออกทางหน้าจอ คุณอาจจะลองเขียนโปรแกรมเพื่อแสดงตัวเลขจาก 30 - 50 โดยการเปลี่ยนตัวแปร $i = 30 และเงื่อนไขเป็น $i <= 50 และดูว่ามันน่าทึ่งแค่ไหน

ต่อไปมาดูตัวอย่างเพิ่มเติมกับการใช้คำสั่ง While loop ซึ่งเราจะสร้างนาฬิกานับถอยหลังสำหรับการปีใหม่

<?php

$i = 20;
$count_by = 2;

while ($i >= 0) {
    echo "Count down $i\n";
    $i -= $count_by;
}

echo "Firework is being fired.\n";
echo "Happy New Year 2017.\n";

?>

ในตัวอย่าง เป็นโปรแกรมสำหรับนับถอยหลังเพื่อฉลองปีใหม่ที่กำลังจะมาถึง ตัวแปร $i เป็นค่าเริ่มต้นของการนับ และ $count_by สำหรับการนับค่าลงทีละของการนับ เงือนไขในคำสั่ง While loop คือ $i >= 0 เราจะทำการนับถ้าหากการนับยังไม่ถึง 0 ในแต่ละรอบเราลดค่าของตัวแปร $i ด้วยคำสั่ง $i -= $count_by ซึ่งเป็นการลดลงที่ละ 2

Count down 20
Count down 18
Count down 16
Count down 14
Count down 12
Count down 10
Count down 8
Count down 6
Count down 4
Count down 2
Count down 0
Firework is being fired.
Happy New Year 2017.

นี่เป็นผลลัพธ์ของโปรแกรม ซึ่งโปรแกรมจะนับจาก 20 จนถึง 0 โดยลดลงทีละ 2 จะเริ่มแสดงข้อความต้อนรับปีใหม่

จากในตัวอย่างทั้งสอง คุณจะเห็นว่าเราสามารถใช้คำสั่งวนซ้ำในการควบคุมให้โปรแกรมทำงานแบบเดิมๆ โดยที่เราไม่ต้องเขียนโค้ดมากมาย ซึ่งสิ่งที่ทำงานซ้ำๆ ก็คือภายในบล็อคของคำสั่ง While loop เป็นการแสดงผลตัวเลขในแต่ละรอบของการทำงาน

คำสั่ง do while loop

คำสั่ง Do while loop นั้นมีการทำงานคล้ายกับคำสั่ง While loop แต่สิ่งที่แตกต่างคือในคำสั่ง Do while loop จะทำงานภายใน Loop ก่อนอย่างน้อยหนึ่งรอบและตรวจสอบเงือนไขในภายหลัง นี่เป็นรูปแบบของการใช้งานคำสั่ง Do while loop ในภาษา PHP

do {
    statements
} while (expression);

ในการใช้งานคำสั่ง Do while loop นั้นส่วนของการตรวจสอบเงื่อนไข expression จะอยู่ตอนท้าย นั่นหมายความจะต้องมีการทำงานในลูปอย่างน้อยแน่นอน 1 รอบ มาดูตัวอย่างการใช้งานคำสั่ง Do while loop ในภาษา PHP กับโปรแกรมการสุ่มตัวเลข

<?php

do {
    $number = rand(0, 8);
    echo "Random number $number\n";
} while ($number != 0);

?>

ในตัวอย่าง เป็นการใช้คำสั่ง Do while loop ในการสุ่มตัวเลขระหว่าง 0 - 8 และโปรแกรมจะทำงานใน Loop ในขณะที่ค่าที่สุ่มได้ไม่ใช่ 0 ในเงื่อนไข $number != 0

Random number 1
Random number 1
Random number 3
Random number 2
Random number 6
Random number 1
Random number 5
Random number 6
Random number 0
Yeah! Random stopped, catch up 0.

นี่เป็นผลลัพธ์ของโปรแกรม ซึ่งในบางสถานการณ์ของการเขียนโปรแกรม คุณอาจจะต้องใช้คำสั่ง Do while loop เพื่ออำนวยความสะดวก เช่น การทำงานที่เงื่อนไขต้องขึ้นกับค่าก่อนหน้าในโปรแกรม อย่างไรก็ตามทั้งคำสั่ง While loop และ Do while loop สามารถใช้แทนกันได้ ในตัวอย่างข้างต้นนี่เป็นโค้ดเมื่อเราเขียนโดยใช้คำสั่ง While loop

<?php

$number = rand(0, 8);
echo "Random number $number\n";

while ($number != 0) {
    $number = rand(0, 8);
    echo "Random number $number\n";
}

echo "Yeah! Random stopped, catch up 0.\n";

?>

เพราะว่าเราต้องการสุ่มค่าและแสดงผลจากการสุ่มที่ได้ คุณอาจจะต้องเขียนคำสั่งเดิมเพิ่มขึ้นมาเมื่อใช้ While loop สำหรับปัญหานี้ ดังนั้นในการเขียนโปรแกรมคุณจะต้องเข้าใจว่าควรจะใช้คำสั่งแบบไหนในการแก้ปัญหา

คำสั่ง for loop

คำสั่ง For loop คือคำสั่งวนซ้ำที่มีการทำงานในจำนวนรอบที่แน่นอน ซึ่งสามารถกำหนดค่าเริ่มต้น เงื่อนไข และการเปลี่ยนแปลงไว้ที่เดียวกันในตอนต้นของ Loop ทำให้การเขียนโปรแกรมสั้นและกระทัดรัดขึ้น นี่เป็นรูปแบบของการใช้งานคำสั่ง For loop ในภาษา PHP

for (initializing; expression; updating)
    statements

โดยที่ initializing เป็นการกำหนดค่าเริ่มต้นสำหรับการทำงานของ Loop expression เป็นเงื่อนไขที่จะให้ทำงานภายใน Loop updating เป็นการเปลี่ยนแปลงของข้อมูลเมื่อเสร็จการทำงานแต่ละรอบของ Loop มาดูตัวอย่างการใช้งานคำสั่ง For loop ในภาษา PHP

<?php

for ($i = 1; $i <= 10; $i++) {
    echo "$i, ";
}
echo "\n";

for ($i = 0; $i <= 50; $i += 5) {
    echo "$i, ";
}
echo "\n";

for ($i = 10; $i >= -10; $i -= 2) {
    echo "$i, ";
}
echo "\n";

?>

ในตัวอย่าง เป็นการใช้งานคำสั่ง For loop เพื่อแสดงตัวเลข ซึ่งคุณจะเห็นว่าเราได้กำหนดค่าเริ่มต้น เงือนไข และการเปลี่ยนแปลงในตอนต้นของ Loop ทำให้คำสั่ง For loop เป็นคำสั่งที่สะดวกและง่ายต่อการใช้งาน ในลูปแรกเป็นการแสดงตัวเลขตั้งแต่ 1 - 10 ลูปที่สองเป็นการแสดงตัวเลขตั้งแต่ 0 - 50 โดยเพิ่มค่าทีละ 5 และในลูปสุดท้าย เป็นการแสดงตัวเลขจาก 10 - -10 โดยลดค่าทีละ 2

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50,
10, 8, 6, 4, 2, 0, -2, -4, -6, -8, -10,

และนี่เป็นผลลัพธ์การทำงานของโปรแกรมในการแสดงผลตัวเลขในแบบต่างๆ ในภาษา PHP

ต่อไปมาดูตัวอย่างเพิ่มเติมกับการใช้งานคำสั่ง Loop กับการคำนวณทางคณิตศาสตร์

<?php

// Finding summation between number m and n
$m = 10;
$n = 50;
$sum = 0;

for ($i = $m; $i <= $n; $i++) {
    $sum += $i;
}
echo "Sum between $m to $n = $sum\n";

?>

ในตัวอย่าง เป็นการใช้คำสั่ง For loop ในการหาผลรวมของตัวเลขระหว่างตัวแปร $m และ $n ในแต่ละรอบเราจะบวกค่าของตัวเลขลงไปในตัวแปร $sum

Sum between 10 to 50 = 1230

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

ตัวอย่างการใช้คำสั่ง For loop ในการหาค่า Factorial ของตัวเลขในภาษา PHP

<?php

// Finding a factorial of n'th number
$n = 5;
$fac = 1;

for ($i = 1; $i <= $n; $i++) {
    $fac *= $i;
}
echo "$n! = $fac";

?>

ในตัวอย่างเป็นโปรแกรมในการหาค่า Factorial ของตัวเลข n โดยสูตรการหาค่า Factorial ก็คือการนำตัวเลขระหว่าง 1 - n มาคูณ ซึ่งเราสามารถใช้คำสั่ง For loop สำหรับจัดการเรื่องนี้ได้อย่างง่ายดาย

เรามีตัวอย่างเพิ่มเติมในการใช้งานคำสั่ง For loop ในโปรแกรมนี้เป็นโปรแกรมในการแปลงอุณหภูมิจากองศาเซลเซียสไปเป็นองศาฟาเรนไฮต์และเคลวิน และแสดงผลเป็นแบบตาราง

<?php

echo "Celsius\t|Fahrenheit|Kelvin\t|Description\n";

$description = [
    0 => "Freezing point of water",
    20 => "Room temperature",
    36  => "Body temperature",
    100  => "Boiling point of water"
];

for ($celcius = 0; $celcius <= 100; $celcius += 4) {
    $fahrenheit = ($celcius * 1.8) + 32;
    $kelvin = $celcius + 273.15;

    echo "$celcius\t| $fahrenheit\t| $kelvin";
    if (array_key_exists($celcius, $description)) {
        echo "\t$description[$celcius]";
    }
    echo "\n";
}

?>

ในตัวอย่างเป็นโปรแกรมในการแปลงอุณหภูมิจากองศาเซลเซียสไปเป็นองศาฟาเรนไฮต์และเคลวิน โดยเริ่มต้นจาก 0 - 100 องศาและเพิ่มขึ้นทีละ 4 และอาเรย์ $description สำหรับเก็บคำอธิบายแต่ละช่วงอุณภูมิไว้โดยมีค่าขององศาเซลเซียสเป็นคีย์ เราใช้ฟังก์ชัน array_key_exists() ในการตรวจสอบถ้าในอุณห๓ูมินี้มีการกำหนดคำอธิบายเพื่อนำไปแสดงในคอลัมน์ Description ของตาราง

$fahrenheit = ($celcius * 1.8) + 32;
$kelvin = $celcius + 273.15;

นี่เป็นสูตรของการแปลงอุณหภูมิ สำหรับการแปลงจากองศาเซลเซียสไปเป็นองศาฟาเรนไฮต์จะมีสูตรเป็น T(F) = T(C) * 5 / 9 + 32 และจากองศาเซลเซียสเป็นเคลวินมีสูตรเป็น K = T(C) + 273.15

Celsius |Fahrenheit|Kelvin      |Description
0       | 32    | 273.15        Freezing point of water
4       | 39.2  | 277.15
8       | 46.4  | 281.15
12      | 53.6  | 285.15
16      | 60.8  | 289.15
20      | 68    | 293.15        Room temperature
24      | 75.2  | 297.15
28      | 82.4  | 301.15
32      | 89.6  | 305.15
36      | 96.8  | 309.15        Body temperature
40      | 104   | 313.15
44      | 111.2 | 317.15
48      | 118.4 | 321.15
52      | 125.6 | 325.15
56      | 132.8 | 329.15
60      | 140   | 333.15
64      | 147.2 | 337.15
68      | 154.4 | 341.15
72      | 161.6 | 345.15
76      | 168.8 | 349.15
80      | 176   | 353.15
84      | 183.2 | 357.15
88      | 190.4 | 361.15
92      | 197.6 | 365.15
96      | 204.8 | 369.15
100     | 212   | 373.15        Boiling point of water

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

คำสั่ง foreach loop

คำสั่ง Foreach loop ถูกออกแบบมาให้ใช้งานกับอาเรย์ มันใช้สำหรับวนอ่านค่าในอาเรย์โดยจะเริ่มจากสมาชิกตัวแรกจนถึงสมาชิกตัวสุดท้าย มาดูตัวอย่างการใช้งาน Foreach ในภาษา PHP

<?php

// foreach with normal array
$numbers = [10, 20, 30, 40, 50];
foreach ($numbers as $el) {
    echo "$el\n";
}

// foreach with key value array
$country["us"] = "United State";
$country["de"] = "German";
$country["uk"] = "Ukraine";
$country["sk"] = "Slovakia";
foreach ($country as $key => $value) {
    echo "$key = $value\n";
}

?>

ในตัวอย่างเป็นการใช้คำสั่ง Foreach ทั้งการอ่านค่าจากอาเรย์แบบปกติและแบบ Key value โดยการทำงานของคำสั่ง Foreach จะวนอ่านค่าภายในอาเรย์ตั้งแต่สมาชิกตัวแรกจนถึงตัวสุดท้าย ในแต่ละรอบของการทำงานข้อมูลจะถูกเก็บในตัวแปร $el และสำหรับแบบ Key value นั้นจะเก็บทั้ง Key และ Value ในตัวแปร $key และ $value ตามลำดับ คุณสามารถเรียนรู้เกี่ยวกับอาเรย์ในบทของอาเรย์

10
20
30
40
50
us = United State
de = German
uk = Ukraine
sk = Slovakia

นี่เป็นผลลัพธ์ของการใช้คำสั่ง Foreach loop กับอาเรย์ในภาษา PHP

คำสั่ง break

คำสั่ง break คือคำสั่งสำหรับในการควบคุมการทำงานของ Loop เพื่อให้หยุดการทำงานในทันที ซึ่งโดยปกติแล้วโปรแกรมจะทำงานใน Loop จนกว่าเงื่อนไขจะไม่เป็นจริง คุณสามารถใช้คำสั่ง break เพื่อบังคับให้โปรแกรมจบการทำงานจาก Loop ได้ มาดูตัวอย่างการใช้คำสั่ง ฺbreak ในภาษา PHP

<?php

for ($i = 1; $i <= 10; $i++) {
    echo "$i, ";
    if ($i == 5) {
        break;
    }
}

?>

ในตัวอย่าง เป็นโปรแกรมในการใช้คำสั่ง break เพื่อหยุดการทำงานเมื่อค่าของ $i เท่ากับ 5 ถึงแม้เงื่อนไขการทำงานของ Loop จะยังคงเป็นจริง แต่เมื่อโปรแกรมพบกับคำสั่ง break มันจะออกจาก Loop ในทันทีโดยไม่สนใจเงื่อนไขอีกต่อไป

1, 2, 3, 4, 5,

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

คำสั่ง continue

คำสั่ง continue คือสำหรับในการควบคุมการทำงานของ Loop เช่นเดียวกันกับคำสั่ง break แต่คำสั่ง continue จะข้ามการทำงานไปรอบต่อไปในทันที โดยที่ไม่สนใจคำสั่งการทำงานหลังจากมัน มาดูตัวอย่างการใช้งานของคำสั่ง continue ในภาษา PHP

<?php

for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 == 0) {
        continue;
    }
    echo "$i, ";
}

?>

ในตัวอย่าง เราใช้คำสั่ง continue ในการบังคับให้โปรแกรมทำงานรอบต่อไปในทันทีเมื่อค่าของ $i นั้นเป็นเลขคู่ นั่นหมายความว่าคำสั่งหลังจากนั้น echo "$i, "; จะถูกข้ามการทำงานไป

1, 3, 5, 7, 9,

นี่เป็นผลลัพธ์ของโปรแกรม ซึ่งคุณจะเห็นว่าเลขจำนวนคู่ถูกข้ามการแสดงผลไปจากการทำงานของคำสั่ง continue

ทั้งคำสั่ง break และ continue สามารถใช้ได้กับ Loop ทุกประเภทที่ได้กล่าวมาในบทนี้ ถึงแม้ว่าในตัวอย่างของเราแสดงเพียงแค่การใช้งานกับคำสั่ง For loop ก็ตาม

คำสั่ง For loop ซ้อน For loop

Loop ทุกประเภทสามารถซ้อนกันได้ เช่นเดี่ยวกันกับคำสั่งเลือกเงื่อนไข ซึ่งการใช้คำสั่ง Loop ซ้อนกันจะใช้จัดการกับงานประเภทที่มีการทำงานแบบสองขั้นหรือสองมิติ เช่น อาเรย์หรือตาราง ในตัวอย่างนี้เราเขียนโปรแกรมเพื่อวาดต้นคริสต์มาสโดยการใช้คำสั่ง For loop ซ้อนกัน

<?php

$size = 10;

// Draw leaves
for ($i = 0; $i < $size; $i++) {
    for ($j = 0; $j < $size * 2; $j++) {
        if ($i >= $size - $j - 1 && 
        $size - $i <= 2* $size - $j - 1)
            echo "*";
        else
            echo " ";
    }
    echo "\n";
}

// Draw tree body
for ($i = 0; $i < 2; $i++) {
    for ($j = 0; $j < $size * 2; $j++) {
        if ($j >= $size - 2 && $j <= $size)
            echo "*";
        else
            echo " ";
    }
    echo "\n";
}

echo "marcuscode.com's Christmas tree";

?>

ในโปรแกรมของเราแบ่งการทำงานออกเป็น 2 ส่วนสำหรับการวาดต้นคริสต์มาส คือส่วนของการวาดใบและต้นไม้ ซึ่งเป็นการซ้อนกันสองชั้น ลูปภายนอกใช้ตัวแปร $i เป็น Index สำหรับจัดการการวาดในแต่ละแถว และลูปภายในใช้ตัวแปร $j เป็น Index สำหรับจัดการการวาดในแต่ละคอลัมน์ และตัวแปร $size เป็นการกำหนดขนาดให้กับต้นคริสต์มาส

         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************
        ***
        ***
marcuscode.com's Christmas tree

นี่เป็นผลลัพธ์ของต้นคริสต์มาสจากโปรแกรมของเรา

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับคำสั่งวนซ้ำในภาษา PHP ซึ่งเป็นคำสั่งที่ทำให้เราสามารถควบคุมการทำงานของโปรแกรมให้ซับซ้อนและมากขึ้นได้

บทความนี้เป็นประโยชน์หรือไม่? Yes · No