מדריך PHP: לולאת foreach
במאמר הקודם למדנו על לולאת for שאותה אנו יכולים להפעיל על מערך נומרי. בטח תהיתם איזה לולאה אפשר להריץ על מערך אסוציאטיבי – התשובה היא לולאת foreach.
לולאת foreach
לולאת foreach היא מעט שונה מלולאת for, יש בה $key ויש בה $value בדיוק כמו שבמערך אסוציאטיבי יש מפתח (key) וערך (value) לכל איבר במערך. הלולאה רצה על כל המערך מתחילתו ועד סופו. אין לנו אפשרות להחליט שהיא תרוץ מ-X עד Y כמו ב-for (בלולאת for אנו יכולים להחליט מה נקודת המוצא של ה-i ועד מתי הוא ירוץ).
<?php $my_arr = array('name' => 'Moshe', 'last_name' => 'Cohen', 'home_phone' => '123456'); foreach ($my_arr as $key => $value) { print "$key : $value"; print '<br />'; }
הנה מערך אסוציאטיבי נחמד שעליו אני אריץ את פקודת ה-foreach. ה-foreach הוא הרבה יותר פשוט מה-for. כל מה שהוא מכיל זה את שם המערך ואז את המילה as ורק אז את פירוט של איך אקרא ל-key ואיך אקרא ל-value בכל מעבר של הלולאה (למעבר כזה קוראים איטרציה או באנגלית iteration).
לולאה פשוטה כזו מדפיסה את המפתח ואז את הערך, מה שאקבל זה משהו כזה:
את לולאת foreach אני יכול להריץ גם על מערך נומרי לגמרי:
<?php $my_arr = array(2,4,6,8,10); foreach ($my_arr as $key => $value) { print "$key : $value"; print '<br />'; }
ואז ה-key יהיה המספר (כמו ה-i ב-for) וה-value יהיה הערך. למשל, הרצת הלולאה הזו תיתן לי:
אפשר לוותר על ה-$value אם אני רוצה רק את המפתח, הרצה של:
<?php $my_arr = array(2,4,6,8,10); foreach ($my_arr as $key) { print "$key"; print '<br />'; }
תיתן לי רק את המפתחות – גם במערך אסוציאטיבי – נסו ותהנו!
לולאת while
While היא לולאה מאד חמודה, שתחזור על עצמה כל עוד היא עונה על תנאי מסוים. דוגמא מסבירה את העניין הכי טוב:
<?php $i = 0; while($i < 6) { print $i; $i++; }
כל עוד ה-i קטן משש, כל מה שיש בתוך הסוגריים המסולסלות ירוץ שוב ושוב. במקרה הזה, כיון שהגדרתי ש-i עולה כל איטרציה (זוכרים מה זה? מדובר בהרצה של לולאה), אז הלולאה תרוץ 5 פעמים.
לעומת for או foreach, הלולאה הזו נראית פשוטה מאד – אבל יש לה עוד סיבוך אחד קטן, ניתן להשתמש ב-do על מנת לוודא שהלולאה תרוץ לפחות פעם אחת: הסינטקס מאד דומה ל-while:
<?php $i = 0; do { print $i; $i++; } while($i < 6);
אבל מה לפי דעתכם יקרה אם אני אכתוב את הדבר הזה?
<?php $i = 0; do { print $i; $i++; } while($i < 0);
בטח תגידו, שום דבר – כי התנאי הזה לא יכול להתקיים אם הגדרתי ש-i שווה לאפס, הוא לא יכול להיות קטן מאפס והתנאי שיש בתוך ה-while לעולם לא יתקיים. אבל כפי שאמרתי, do while מאפשר לנו לוודא שהלולאה תרוץ לפחות פעם אחת וזה בדיוק מה שהיא תעשה, תרוץ פעם אחת, תדפיס אפס ותפסיק.
Continue ו-break
אחרי שסיימנו עם לולאות, כדאי להרחיב מעט על שתי פקודות חשובות שיש להן משמעות רק בתוך לולאה.
Break
הפקודה break שוברת את הלולאה מיידית ומפסיקה כל איטרציה. סוג של מנגנון חירום אם תרצו. אני אדגים באופן הבא:
<?php $i = 1; while($i < 6) { if($i%3 == 0) { print 'It is devided in 3!'; break; } print $i; print '<br />'; $i++; }
וואו! יצא קצת ארוך! יש פה לולאת while רגילה, אבל בתוכה שמתי תנאי: אם ה-i שלי מתחלק בשלוש בלי שארית, אז תדפיס 'זה מתחלק בשלוש' ותשבור את הלולאה. הפלט יראה כך:
בהתחלה הלולאה רצה (מתחילים ב-1), 1 לא מתחלק ל-3 בלי שארית, התנאי לא מתקיים ויש הדפסה של i, ו-br (בשביל ירידת השורה), מעלים את i ומתחילים מהתחלה. בריצה הבאה i כבר שווה ל-2, גם 2 לא מתחלק ב-3 בלי שארית ולפיכך התנאי לא מתקיים. הדפסה של 2 ושל br, מעלים את i ומתחילים מהתחלה, הפעם i כבר שווה 3 וזה מתחלק ב-3, התנאי מתקיים. בתוך התנאי יש הדפסה של 'זה מתחלק ב-3' ואז הפקודה break שמפסיקה את הלולאה מיידית, למרות שאם מסתכלים בתנאי שיש ב-while אז דווקא הוא אמור להמשיך.
למה זה שימושי? תחשבו למשל על לולאה שמריצה ממספר 500 עד מספר מיליון, אני רוצה שהיא תמצא לי 10 מספרים שיכולים להתחלק ב-4, אחרי שהיא מצאה אותם, אין טעם שהיא תרוץ יותר ותכלה את משאבי המערכת, נכון? לפיכך יש לנו break.
<?php $i = 1; while($i < 1000000) { if($i%4 == 0) { $my_arr[] = $i; if($my_arr[10]) { print 'finished'; break; } } $i++; } print_r($my_arr);
הפקודה הזו באה בעיקר על מנת לייעל את המערכת.
continue
פקודת continue לא שוברת את הלולאה, אבל מעבירה אותנו מיידית לאיטרציה הבאה, בלי להתחשב בשאר השורות. הכי טוב להסביר עם דוגמא:
<?php $i = 0; while $i<6 { $i++; if ($i == 4) { echo "hello"; continue; } if ($i == 4) { echo "hello"; } }
כמה פעמים המילה hello תודפס לפי דעתכם? אם לא היה לנו continue, היינו מצפים לראות הדפסה של פעמיים hello, כיוון שהלולאה רצה עד שה-i מגיע ל-4, התנאי הראשון מתמלא, מודפס hello אחד ואז נתקלים ב-continue ואז יש דילוג מיידי לאיטרציה הבאה.
תגובות בפייסבוק