
לולאת for ב-PHP
לולאת for היא מבנה בקרה נפוץ ושימושי במיוחד בשפת PHP, כמו גם בשפות תכנות רבות אחרות. באמצעות לולאת for, ניתן להריץ קטע קוד ביעילות מספר מוגדר של פעמים, דבר שהופך את הלולאה לאידיאלית עבור משימות חזרתיות.
לולאת for מבצעת בלוק קוד שוב ושוב, כל עוד תנאי שצוין מוערך כ-true. כל הרצה של בלוק הקוד מכונה "איטרציה". נהוג לקבוע משתנה שמשנה את ערכו בכל איטרציה. משתנה זה מכונה "משתנה הלולאה".
ללולאה יש מבנה מוגדר עם שלושה מרכיבים עיקריים: אתחול, תנאי והגדלה/הקטנה.
תחביר:
for (initialization; condition; increment/decrement) {
// Code to execute
}
אתחול (initialization) - מגדיר את ערכי ההתחלה של הלולאה.
תנאי (condition) - בדיקה האם הלולאה צריכה להמשיך לאיטרציה נוספת.
הגדלה (increment) / הקטנה (decrement) - עדכון משתנה הלולאה.
ביצוע הלולאה נעשה באופן הבא:
- אתחול (שלב זה מתבצע פעם אחת בלבד)
- בדיקת התנאי: אם מתקיים ממשיכים, אחרת הלולאה מסתיימת
- הרצת בלוק הקוד
- הגדלה / הקטנה
- חזרה לשלב 2
דוגמה:
<?php
for ($i = 1; $i <= 5; $i++) {
echo "Iteration $i\n";
}
// Outputs:
// Iteration 1
// Iteration 2
// Iteration 3
// Iteration 4
// Iteration 5
?>
בדוגמה זו, מבצעים אתחול של משתנה הלולאה i לערך 1. נבדק התנאי: i קטן או שווה ל-5. אם התנאי מתקיים, מדפיסים על המסך Iteration i (כאשר i הוא ערך משתנה הלולאה i באותה איטרציה), מגדילים את i ב-1 וחוזרים לבדיקה נוספת של התנאי. הלולאה מבצעת 5 איטרציות, כלומר, בלוק הקוד שבתוך הלולאה רץ 5 פעמים.
לולאות for לא שגרתיות
לולאת for יכולה לכלול יותר מכמה אתחולים או הגדלות. במקרה כזה, נשתמש בפסיק להפרדה בין האתחולים השונים, התנאים השונים או ההגדלות השונות.
דוגמה:
<?php
for ($i = 0, $j = 10; $i <= 5; $i++, $j--) {
echo "i: $i, j: $j\n";
}
// Outputs:
// i: 0, j: 10
// i: 1, j: 9
// ...
?>
בדוגמה זו, חלק האתחול כולל גם אתחול למשתנה i שנקבע להיות 0 וגם למשתנה j שנקבע להיות 10. חלק ההגדלה כולל גם הגדלה של i ב-1 וגם הקטנה של j ב-1.
אם נרצה לקבוע לולאה עם יותר מתנאי אחד, נשתמש באופרטור וגם (&&).
דוגמה:
<?php
for ($i = 0, $j = 10; $i < 5 && $j > 5; $i++, $j--) {
echo "i = $i, j = $j\n";
}
// Outputs:
// i = 0, j = 10
// i = 1, j = 9
// i = 2, j = 8
// i = 3, j = 7
// i = 4, j = 6
?>
לולאת for יכולה שלא לכלול כלל את אחד מ-3 ההגדרות שלה: אתחול, תנאי, הגדלה.
דוגמה:
<?php
$i = 0; // Initialization outside the loop
for (; $i < 5; ) { // No initialization and increment inside the loop
echo "Iteration $i\n";
$i++; // Increment manually inside the loop body
}
// Outputs:
// Iteration 0
// Iteration 1
// Iteration 2
// Iteration 3
// Iteration 4
?>
בדוגמה זו, חלק האתחול וחלק ההגדלה חסרים. משתנה הלולאה i אותחל לפני הלולאה עם הערך 0, וההגדלה נעשית בתוך הלולאה עצמה.
ברוב המקרים, נעדיף שהאתחול, התנאי וההגדלה יבוצעו בשורת ההצהרה של לולאת ה-for ולא בצורות אחרות, כך קריאות הקוד נשמרת.
לולאות for מקוננות
ניתן לבצע קינון לולאות, כלומר, לולאה ראשית ובתוכה לולאה נוספת.
דוגמה:
<?php
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
echo "$i * $j = " . ($i * $j) . "\n";
}
}
// Outputs:
// 1 * 1 = 1
// 1 * 2 = 2
// 1 * 3 = 3
// 2 * 1 = 2
// ...
?>
בדוגמה זו, ניתן לראות קינון של 2 לולאות for, לולאה בתוך לולאה. הלולאה החיצונית עם משתנה הלולאה i רצה 3 פעמים (החל מערך 1 עד 3) ובכל ריצה שכזו, הלולאה הפנימית עם משתנה הלולאה j רצה 3 פעמים (החל מערך 1 עד 3). בסה"כ, יבוצעו 9 איטרציות של בלוק הקוד הפנימי.
אין הגבלה על עומק הקינון, כלומר, ניתן לקנן ללא הגבלה לולאה בתוך לולאה בתוך לולאה וכן הלאה. עם זאת, יש לקחת בחשבון כי כל רמת קינון נוספת מאיטה את הקוד וצורכת יותר זכרון. לכן, במידת האפשר, מוטב שלא להעמיק יותר מדי רמות קינון. קינון מעבר לעומק של 3 רמות אינו נפוץ במיוחד.
הצהרות break ו-continue בלולאות for
הצהרת continue מדלגת על המשך האיטרציה הנוכחית ועוברת לאיטרציה הבאה.
יש לשים לב, כי אם הקוד כולל לולאות מקוננות, הדילוג נעשה לאיטרציה הבאה של הלולאה בה מופיעה ההצהרה. כלומר, אם הצהרת ה-continue היא בתוך הלולאה הפנימית, יבוצע דילוג לאיטרציה הבאה של הלולאה הפנימית, ולא של החיצונית.
דוגמה:
<?php
for ($i = 1; $i <= 10; $i++) {
if ($i % 2 === 0) {
continue; // Skip even numbers
}
echo $i . "\n";
}
// Outputs: 1, 3, 5, 7, 9
?>
בדוגמה זו, הלולאה רצה 10 פעמים. בכל איטרציה נבדק התנאי i % 2 == 0, כלומר, האם i מודולו 2 הוא 0 (שזה אומר ש-i הוא זוגי). אם התנאי מתקיים (אם i זוגי), מסתיימת האיטרציה הנוכחית, מבלי להמשיך את הרצת בלוק הקוד של הלולאה. הפלט יכלול הדפסה של כל ערכי i שאינם זוגיים.
הצהרת break מסיימת את הלולאה מיד ויוצאת ממנה.
דוגמה:
<?php
for ($i = 1; $i <= 10; $i++) {
if ($i === 5) {
break; // Exit the loop when $i is 5
}
echo $i . "\n";
}
// Outputs: 1, 2, 3, 4
?>
גם כאן, יש לשים לב, כי אם הקוד כולל לולאות מקוננות, הצהרת break מסיימת את הלולאה שבה היא נמצאת. אם לדוגמה יש 3 רמות קינון (לולאה בתוך לולאה בתוך לולאה) והצהרת ה-break נמצאת בתוך הלולאה האמצעית (לא החיצונית ולא הפנימית), אז תבוצע יציאה מהלולאה האמצעית להמשך הקוד של הלולאה שעוטפת אותה.
דוגמה:
<?php
for ($i = 1; $i <= 3; $i++) { // Outer loop
echo "Outer Loop: $i\n";
for ($j = 1; $j <= 3; $j++) { // Middle loop
echo " Middle Loop: $j\n";
if ($j == 2) { // Break out of the middle loop when $j equals 2
echo " Breaking out of the middle loop\n";
break;
}
for ($k = 1; $k <= 2; $k++) { // Inner loop
echo " Inner Loop: $k\n";
}
}
}
// Outputs:
// Outer Loop: 1
// Middle Loop: 1
// Inner Loop: 1
// Inner Loop: 2
// Middle Loop: 2
// Breaking out of the middle loop
// Outer Loop: 2
// Middle Loop: 1
// Inner Loop: 1
// Inner Loop: 2
// Middle Loop: 2
// Breaking out of the middle loop
// Outer Loop: 3
// Middle Loop: 1
// Inner Loop: 1
// Inner Loop: 2
// Middle Loop: 2
// Breaking out of the middle loop
?>
שימושים נפוצים, טיפים ודוגמאות מהעולם האמיתי
שימוש נפוץ ללולאות הוא מעבר על מערכים. חשוב לזכור כי האיבר הראשון במערך הוא עם אינדקס 0 ולא עם אינדקס 1.
דוגמה:
<?php
$fruits = ["Apple", "Banana", "Cherry"];
for ($i = 0; $i < count($fruits); $i++) {
echo $fruits[$i] . "\n";
}
// Outputs:
// Apple
// Banana
// Cherry
?>
לעיתים, מוטב שמשתנה הלולאה יהיה עם שם אינפורמטיבי ולא סתם i או j. הדבר משפר את קריאות הקוד.
דוגמה:
<?php
for ($row = 0; $row < 10; $row++) {
echo "Row: $row\n";
}
?>
אתחול הלולאה נעשה פעם אחת בלבד, בעוד שתנאי הלולאה נעשה בכל איטרציה. לכן, מוטב להעביר חישובים חוזרים מתנאי הלולאה לחלק האיתחול, לדוגמה במקרה של העברה של פונקציית count לחישוב גודלו של מערך. באופן הזה, זמן הביצוע של הלולאה מתקצר.
דוגמה:
<?php
for ($i = 0, $size = count($array); $i < $size; $i++) {
echo $array[$i] . "\n";
}
?>
יש לשים לב שלא להתבלבל באיתחול ובתנאי, דבר שעלול להביא לפחות איטרציות מהמתוכנן להתבצע.
דוגמה:
<?php
// Running only 9 iterations
for ($i = 1; $i < 10; $i++) {
// Missing the last iteration
}
// Running 10 iterations
for ($i = 1; $i <= 10; $i++) {
// Correct
}
?>