אתה נמצא כאן יסודות השפה  >>  מבני בקרה  >>  לולאת foreach

לולאת foreach

PHP תומכת בלולאה מיוחדת למערכים (ירושה מ-Perl). הלולאה הזו היא foreach וישנם שתי דרכים לכתוב אותה:

<?php
  /* way 1: */
  foreach
/*לכל איבר במערך, בצע את האיטרציה...*/
 ($array
/*המערך עליו אנו רצים.*/
 as $value
/*את האיבר הנוכחי במערך שומרים ב-$value.
כאן אנו שומרים רק את ערכו של האיבר.
*/
)
  {
     ...
     statements;
     ...
/*בכל איטרציה אנו מבצעים את הפקודות statements.*/

  }
  
  /* way 2: */
  foreach
/*לכל איבר במערך, בצע את האיטרציה...*/
 ($array
/*המערך עליו אנו רצים.*/
 as $key=>$value
/*את האיבר הנוכחי במערך שומרים כ-$key=>$value.
את המפתח שומרים ב-$key, ואת הערך ב-$value.
*/
)
  {
     ...
     statements;
     ...
/*בכל איטרציה אנו מבצעים את הפקודות statements.*/

  }
?>

הלולאה עוברת על כל איברי המערך, ומשתמשת באופן אוטומטי במצביע פנימי משלה לאיבר הנוכחי במערך. בהתחלה של הלולאה המצביע הנ"ל מאותחל ומצביע לאיבר הראשון במערך. החלק של "as $value" בדרך הראשונה מציין שאת הערך של האיבר הנוכחי (שהמצביע מכוון אליו) יש לשמור בתוך המשתנה $value. הקידום בלולאה נעשה באופן אוטומטי ע"י שינוי המצביע הפנימי לאיבר הבא במערך. הלולאה נעצרת באופן אוטומטי כאשר מגיעים לסוף המערך.
בדרך הראשונה שמרנו רק את ערכו של האיבר הנוכחי במערך. בדרך השנייה אנו שומרים בצורה כזו גם את המפתח של האיבר הנוכחי (בתוך $key) וגם את ערכו (בתוך $value).

<?php
  $arr=array('zero','one','two'=>2);
  foreach ($arr as $key=>$val)
     echo "key:$key value:$val<BR>\n";
?>

כל לולאת foreach ניתן לכתוב גם כלולאת while עם שימוש בפונקציה each() שנעה על כל איברי המערך עם מצביע פנימי שמקודם אוטומטית לאיבר הבא במערך בכל קריאה לפונקציה, ובפונקציה reset() שמאתחלת את המצביע הפנימי לאיבר הראשון במערך, ולפעמים יש צורך גם בפונקצית הבנייה list().
את הדוגמא הקודמת ניתן לכתוב כלולאת while בצורה הבאה:

<?php
  $arr=array('zero','one','two'=>2);
  reset($arr);
/*מאתחל את המצביע הפנימי של המערך לאיבר הראשון.*/

  while
/*לולאה זו שקולה ללואה:
foreach ($arr as $key=>$val)
*/
 (list($key,$val)
/*מחלק את איברי המערך,
כך שהאיבר הראשון נשמר ב-$key, והשני ב-$val.
*/
=each($arr)
/*מחזיר מערך של המפתח והערך של האיבר הנוכחי במערך.*/
)
     echo "key:$key value:$val<BR>\n";
?>


תגובות בנושא

שאלה קטנה: 06-12-02 23:02
 יקיר סיטבון
#285

האם לולאת foreach צורתה היא כמו ב-ASP?

יקיר

תשובה: כן 07-12-02 00:00
 אלי חן (מנהל)
#287

די דומה ל-ASP... אני לא ממש מכיר את ASP (אני לא צריך את זה בכלל), אך ממה שראיתי הלולאה ב-PHP אפילו יותר משוכללת, כי אפשר לקבל ממנה לא רק את הערכים אלא גם את המפתחות... אולי גם ב-ASP יש משהו דומה, אבל אל תשאל אותי לגבי ASP - אני לא יודע ולא ממש מעניין אותי... :)

תודה. 02-11-02 05:01
 יקיר סיטבון
#603

גם אותי ASP לא הכי מעניינת אותי כבר :)

ותודה לך.

זה לא דומה 02-11-02 15:01
 פלג
#611

אלא אם כן אתה רץ על משהו מובנה כמו פרמטרים של השרת
אחרת הלולאה שונה מכיוו שב asp אתה לא יכול לבנות מערכים באותו מבנה כמו ב php כי שם זה מערכים בסגנון
visual basic כאשר לדוגמא לא ניתן להגדיר :
$arr=array('zero','one','two'=>2);

לא הבנתי מה reset עושה 08-12-03 07:01
 אביאל
#1022

לא הבנתי מה reset עושה, אם תוכל להסביר לי אני אשמח מאוד.

אביאל.

מצביע פנימי למערך 08-12-03 05:00
 אלי חן (מנהל)
#1043

לכל מערך יש מצביע פנימי, שמצביע על האיבר הנוכחי. כאשר משתשים בפונקציה each, אז מוחזר ערכו של האיבר עליו המצביע מכוון, ואז המצביע מקודם לאיבר הבא. בפעם הבאה שתיקרא ל-each, אז יוחזר האיבר הבא.
הפונקציה reset מחזירה את המצביע הפנימי הזה להתחלה של המערך.
דרך אגב, מבנה הבקרה foreach מחזיר את המצביע הנ"ל להתחלה באופן אוטומטי.

שאלה 08-12-04 06:02
 איתן בןאב
#1736

מתי הלולאה של הwhile תחזיר ערך FALSE ולמה ?

עוד שאלה... 08-12-04 06:02
 איתן בןאב
#1737

סליחה שאני כותב פעמים...פשוט אי אפשר לערוך הודעות.
האם יש עוד שימושים בלולאת foreach או שכל מה שהיא עושה זה פשוט לרשום מערכים בתוך משתנים ?


לדף הקודםלולאת for -הקודם
לתחילת הדףלתחילת הדף
הבא- הפסקת לולאה - breakלדף הבא