PHP/לולאות
מה זה לולאה?
עריכהלולאה זה בעצם קטע קוד שמבוצע מספר פעמים בהתאם לתנאי. לדוגמה קטע קוד שמבוצע עד שהערך של משתנה מסוים שווה ל1. לולאות הן מרכיב יסוד בכל קוד , ומשתמשים בהן המון.
לולאת While
עריכהתחביר
עריכהלולאת while היא הלולאה הפשוטה ביותר ב-PHP. התחביר הבסיסי של לולאת while נראה כך:
while (expression) statement;
לשם הבהרה "expression" הוא ביטוי כלשהו כאשר כל עוד הוא מחזיר אמת, הלולאה תמשיך ותתבצע. ברגע שיהפוך ה-expression לביטוי שקר, תחדול הלולאה מלהתבצע. התחביר הנ"ל, נכון כאשר הלולאה מבצעת פקודה אחת בלבד.
כאשר יש צורך בביצוע של מספר פקודות בכל איטרציה (חזרה) של הלולאה, יש לתחום את הפקודות בסוגריים מסולסלים ({}) בצורה הבאה:
while(expression) { statement; statement; . . . }
תחביר אפשרי נוסף, אם כי לרוב לא מקובל, הוא התחביר while...endwhile אשר נכתב בצורה הבאה:
while(expression): statement; . . endwhile;
בצורה זו, לא משנה אם מדובר בפקודה בודדת או בבלוק של פקודות בכל איטרציה של הלולאה, אין אנו תוחמים אותן בסוגריים מסולסלים כפי שהוצג בתחביר הקודם.
דוגמאות קוד
עריכהדוגמא 1
עריכהביצוע פקודה בודדת בלולאה.
$num = 1; while ($num < 10) $num++; echo $num;
שים לב כי בלולאה זו, אין תחימה של פקודה או מס' פקודות באמצעות { }, ולכן הלולאה תבצע את הפקודה שאחריה בלבד, ואילו הפקודה, echo $num תתבצע רק לאחר יציאה מהלולאה.
דוגמא זו די פשוטה, יש לנו משתנה בשם num ובו הערך 1. בעת כניסה ללולאה נבדק האם num קטן מ-10 במידה וכן, בתוך הלולאה תתבצע הגדלתו של num ב-1. הלולאה תתבצע 9 פעמים, כאשר בפעם התשיעית, יוגדל ערכו של num ל-10, ושוב ייבדק הביטוי: "האם num קטן מ-10?", ומכיוון ש-10 אינו קטן מ-10, הלולאה לא תתבצע שוב, והמפענח (interpreter), יעבור לפקודה הבאה, שהיא הדפסת הערך של num, במקרה הזה יודפס לנו 10.
דוגמא 2
עריכהביצוע מס' פקודות בלולאה.
$num = 1; while ($num < 10) { echo $num; $num++; }
$num = 1; while ($num < 10): echo "$num "; $num++; endwhile;
שתי הלולאות הללו, הן למעשה אותה לולאה אך בתחביר שונה. שתיהן מבצעות בדיוק את אותו הדבר. המשתנה num מקבל את הערך 1. בפעם הראשונה נבדק האם num<10 (האם 1 קטן מ-10), ומכיוון שזהו ביטוי אמת, אנו נכנסים ללולאה בפעם הראשונה, מדפיסים את num ומגדילים את ערכו ב-1, וחוזר חלילה. בפעם התשיעית מודפסת הספרה 9, וערכו של num גדל ל-10, כך שבפעם הבאה שתתבצע הבדיקה, num כבר יהיה שווה ל-10 ולא קטן ממנו. לכן גוף הלולאה לא יתבצע שוב. הפלט שיווצר לנו בכל אחת מן הדוגמאות הנ"ל הוא:
1 2 3 4 5 6 7 8 9
חשוב לזכור
עריכהבלולאת while, עקב אופן הפעילות שלה, יש לדאוג שבשלב כלשהו יקבע הביטוי הנבדק כביטוי שקר, אחרת יווצר מצב של לולאה אינסופית.
דוגמא ללולאה אין סופית
עריכה$num = 1; while ($num < 10) { echo $num; }
בדוגמא זו נבדק בכל כניסה ללולאה האם num קטן מ-10, אך באף מקום בלולאה לא מוגדל ערכו של num, אלא מודפס בלבד. מכיוון שבדרך זו ערכו של num לעולם לא ישתנה, הביטוי לנצח ישאר אותר אותו ביטוי (1<10) - שזהו ביטוי אמת. לכן הלולאה תמשיך להתבצע שוב ושוב ושוב עד שבמוקדם או במאוחר השרת יעצור את ביצוע התסריט מכיוון שעבר הזמן המירבי שהוגדר לביצוע תסריט של עמוד כלשהו, ותודפס הודעת שגיאה.
לולאת Do...While
עריכהלולאת do...while דומה באופן פעולתה ללולאת while. ההבדל בין השתיים, הוא שבלולאת do while הבדיקה להמשך פעולתה של הלולאה נעשית בסוף כל איטרציה. מה שמבטיח לנו כי גוף הלולאה יתבצע לפחות פעם אחת. תחביר הלולאה נראה כך:
do { statement; statement; . . . } while (Expression)
בדרך זו, גוף הלולאה יתבצע בפעם הראשונה, ואז יבדק הביטוי Expression. אם יחזיר הביטוי 'אמת', תמשיך הלולאה להתבצע. אם יחזיר 'שקר', תחדל הלולאה מלהתבצע.
דוגמא
עריכה$num = 1; do { echo $num; } while ($num < 1)
בדוגמא זו, לפני הכניסה ללולאה מוצב למשתנה num הערך 1. מיד אחר כך מתבצע גוף הלולאה בפעם הראשונה, ומדפיס את ערכו של num. ורק אז מתבצעת הבדיקה להמשך הלולאה, שם נבדק האם num קטן מ-1, מכיוון ש-1 לא קטן מ-1, הלולאה לא תתבצע שוב.
אך ראינו כי למרות שהתנאי הנלווה ל-while מחזיר שקר, גוף הלולאה מתבצע לפחות פעם אחת.
לולאת For
עריכהלולאות FOR הן דוגמא פשוטה מאוד ללולאות בתכנות. הלולאה הזאת פועלת בצורה כמעט זהה לזאת של לולאת ה-WHILE, ניתן להגיד שהיא מקרה ייחודי של לולאה הרצה כמות קבועה של פעמים, מעט יותר מהר מ-WHILE.
תחביר
עריכהלולאת FOR מורכבת משלושה חלקים בתוך הסוגריים שלה: הגדרת המשתנה הראשוני; תנאי ההמשכיות; ופעולת ההרצה. הגדרת המשתנה הראשוני נועדה כדי לבחור מאיפה תתחיל הלולאה והספירה. תנאי ההמשכיות הוא הנקודה בה הלולאה תפסיק, ופעולת ההרצה היא שמגדירה מה יקרה בסוף כל הרצה של הלולאה. זה עלול להשמע מסובך בתחילה, אבל זה למעשה פשוט למדי. אם נרצה להריץ לולאה שתרוץ שלושה פעמים, החל מהמספר 1 וכלה במספר 3, נריץ את הלולאה הבאה:
for($i=1;$i<=3;$i++)
ניתן לראות את החוקים הבסיסיים של PHP נוכחים בקלות. תחילה אנו קוראים ללולאת ה-FOR, ובתוך הסוגריים שלה אנו מגדירים את המשתנה הראשוני. $i הוא שם נפוץ, אבל ניתן להשתמש בכל שם משתנה רצוי. אנו מגדירים ש-$i, בתחילת הלולאה, שווה ל-1. אנו מסיימים את החלק הראשון בנקודה-פסיק. בחלק השני אנו מגדירים את תנאי ההמשכיות - על הלולאה להמשך כל עוד $i קטן או שווה ל-3, נקודה-פסיק. ולבסוף פעולת ההרצה. ++i$ מסמל עלייה במספר אחד (או באות אחת, אם $i הוא ערך מחרוזת). הפונקציה שבתוך לולאת ה-for תורץ תחילה כאשר $i שווה לאחד, וכאשר הפונקציה תסתיים, $i יעלה במספר אחד, ויהפוך לשתיים. הפונקציה תורץ שוב. $i יהפוך לשלוש - הוא עדיין בתוך תנאי ההמשכיות של הלולאה. הפונקציה תורץ פעם שלישית, ו-$i יוגדר כ-4. כעת הוא לא בתוך תנאי ההמשכיות של הלולאה, ולכן הלולאה תפסק. ניקח לדוגמא את הלולאה הבאה:
for($i=1;$i<=3;$i++){ echo "Loop number $i.\n"; }
התוצאה שתוצג תהיה:
Loop number 1. Loop number 2. Loop number 3.
לולאות FOR פחות נפוצות
עריכהבדוגמא הקודמת הוצגה לולאת FOR בצורה הכי נפוצה שלה - ספירה והרצה של קטע קוד כלשהוא מספר פעמים. זאת היעילות העיקרית של לולאות FOR. אבל לעיתים משתמשים בלולאות ה-FOR בדרכים שונות, יותר מסובכות. לדוגמא, ישנם הלולאות שמשתמשות באותיות להרצה:
for($i="a";$i!="z";$i++){ echo strtoupper($i)."! "; }
זה יציג:
A! B! C! D! E! F! G! H! I! J! K! L! M! N! O! P! Q! R! S! T! U! V! W! X! Y!
ישנן וריאציות מרובות של לולאות FOR, ולא ניתן להציג את כולן. אבל שלושת קטעי הלולאה תמיד יהיו תקפים, ותמיד יוכלו להסביר את פעולת הלולאה: הגדרת משתנה ראשוני, תנאי ההמשכיות ופעולת ההרצה.
החסרת פעולות הלולאה ודמיון עם WHILE
עריכהיש להעיר שלולאת ה-FOR אינה צריכה את שלושת הקטעים שלה כדי לפעול. לעיתים, כאשר המשתנה כבר הוגדר מראש, אין צורך להכניס אותו לתוך הלולאה; או, לחלופין, ייתכן ופעולת ההרצה כבר נמצאת בתוך קטע הקוד של ההרצה, ולכן לא צריך פעולת הרצה בלולאה עצמה. ניתן אפילו לעצור את הלולאה בעזרת תנאי פנימי בעזרת מילת הפקודה break. הנה הלולאה שבה השתמשנו כדוגמא בתחילת ההסבר:
for($i=1;$i<=3;$i++){ echo "Loop number $i.\n"; }
היא זהה בפעילות גם אל הלולאה הבאה:
$i = 1; for(;$i<=3;$i++){ echo "Loop number $i.\n"; }
והיא שווה לחלוטין אל הלולאה הזאת:
$i = 1; for(;$i<=3;){ echo "Loop number $i.\n"; $i++; }
שימו לב למיקומי הנקודה-פסיק. צריך לשמור אותם כדי ש-PHP יוכל לזהות את הקטעים הנכונים כראוי. לבסוף, יש לזכור שהלולאה הזאת זהה אל לולאת ה-WHILE הבאה:
$i = 1; while($i<=3){ echo "Loop number $i.\n"; $i++; }
אם כי לולאת ה-FOR המתאימה מהירה יותר במקצת. ולבסוף, ניתן גם להשתמש בלולאה הבאה, שבה לולאת ה-FOR כמעט ריקה:
$i = 1; for(;;){ if($i<=3) break; echo "Loop number $i.\n"; $i++; }
הלולאה תעבוד כרגיל.
שימושים ללולאת FOR
עריכההיתרון היחיד של לולאת ה-FOR על לולאת ה-WHILE הוא שלולאת ה-FOR מהירה במקצת מלולאת ה-WHILE. תמיד כאשר אפשר, עדיף להשתמש ב-FOR, אבל לעיתים זה כולל סיבוך מיותר של הקוד, ולכן עדיף השימוש בלולאת ה-WHILE. בלולאת ה-FOR עדיף להשתמש כאשר אתה רוצה להריץ פונקציה מספר קבוע של פעמים. למשל, אם אתה רוצה לכתוב את אותה שורת הטקסט מאה פעמים, תוכל להשתמש בלולאת ה-FOR, כאשר תנאי ההמשכיות שלה הוא ש-i$ קטן או שווה למאה. לחלופין, אם אתה רוצה להריץ שורת קוד מסויימת כמות בלתי ידועה של פעמים, כמות אשר שמורה בתוך משתנה שנשלף ממסד הנתונים או שהוזן על ידי מבקר, תוכל להגדיר את כמות ההרצות הרצויות בתור x$, ואז להשתמש בלולאה הרגילה, כאשר אתה מחליף את המספר במשתנה:
for($i=1;$i<=$x;$i++){ }
או בקוד הזהה בפעילותו (מלבד הערכים המדוייקים הנשמרים ב-i$):
for($i=0;$i<$x;$i++){ }
מעבר לכך, רק ההכרות שלכם עם המצב תראה מתי השימוש בלולאת ה-FOR יותר יעילה.
לולאת Foreach
עריכהלולאת FOREACH היא לולאה העוברת על מערך (פעם אחת על כל ערך) ויכולה להשתמש בערך במהלך האיטרציה:
דוגמא ראשונה
עריכה<?php $myArray = array( 'one', 'two', 'three'); foreach ($myArray as $object) { print $object." "; } ?>
- בדוגמא אנחנו רואים שהקוד עובר על כל אחד מהאיברים במערך ומדפיס אותם (בקצה הוספנו רווח כדי שלא יצא הכל במילה אחת). למרות שנראה שאנחנו תמיד מדפיסים את אותו משתנה ($object), למעשה לולאת ה-FOREACH מכניס בכל פעם את האיבר הבא במערך לתוך המשתנה ולכן אנחנו יכולים להשתמש בו.
- חשוב: לולאת FOREACH לא משנה את המערך או את המבנה שלו, ולכן ניתן לעבור עליו במספר לולאות FOREACH אחת אחרי השניה ואפילו בלולאות מקוננות. (כל זה כל עוד לא עשינו משהו למערך בתוך הלולאה)
דוגמא שנייה
עריכה<?php $sum = 0; $numbers = array( 15, 75, 32, 12); foreach ($numbers as $num) { $sum += $num; } echo $sum; ?>
- בדוגמא השניה התסריט מוסיף את המשתנה של הלולאה ($num) לתוך משתנה חיצוני ולכן מאפשר לנו לקבל את סכום הציונים (134).
דוגמא שלישית
עריכה<?php $i = 0; $sum = 0; $grade['moshe'] = 60; $grade['kipi'] = 95; $grade['elmo'] = 100; foreach ($grade as $name=>$grd) { echo "$name received a grade of $grd on the exam.\n"; $i++; $sum += $grd; } echo "The average at class is: ".$sum/$i."\n"; ?>
- בדוגמא השלישית אנחנו רואים דוגמא לתחביר מעט שונה. במקרה הזה המערך הוא מערך אסוציאטיבי (כלומר לכל ערך יש שם מזהה, מפתח, המשמש כאינדקס מילולי ולא מספרי). אנחנו יכולים לעבור על מערך כזה בצורה שראינו בדוגמאות 1 ו-2, אבל יש לנו גם אפשרות לקבל בלולאת את גם המפתח של הערך לתוך משתנה. התחביר הוא מפתח=>ערך (foreach ($var as $key=>$value)).
- תחביר זה מאפשר לנו לתת יותר מידע על המערך ולקשר בין שני הנתונים גם בהמשך התסריט.
הפרק הקודם: מערכים |
לולאות | הפרק הבא: פונקציות |