מדריך PHP

מדריך PHP: לולאת foreach

‏ • Internet Israel

במאמר הקודם למדנו על לולאת 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 loop in php example

את לולאת 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 יהיה הערך. למשל, הרצת הלולאה הזו תיתן לי:

foreach loop in php example for numeric array

אפשר לוותר על ה-$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 שלי מתחלק בשלוש בלי שארית, אז תדפיס 'זה מתחלק בשלוש' ותשבור את הלולאה. הפלט יראה כך:

while loop example in php

 

בהתחלה הלולאה רצה (מתחילים ב-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 ואז יש דילוג מיידי לאיטרציה הבאה.

תגיות: , , ,

רן בר-זיק

מתכנת PHP מנוסה ובעל ידע רב בפיתוח לאינטרנט על בסיס LAMP. מומחה במערכות דרופל, ג'ומלה ו-וורדפרס. שולט היטב בכל מה שקשור לפרונט אנד: JavaScript: jQuery ו-MooTools,ActionScript 2/3 וכמובן HTML 5 + CSS 3.אינטרנט ישראל: www.internet-israel.com

תגובות בפייסבוק