םש להא ןוכית , ןג תמר סרוק

Download Report

Transcript םש להא ןוכית , ןג תמר סרוק

‫תיכון אהל שם‪ ,‬רמת גן‬
‫קורס ‪ – PHP‬הרצאה מס' ‪9‬‬
‫מערכים‬
‫•רקע כללי‬
‫•הגדרת מערך פשוט – וריצה לאורכו‬
‫•מערכים בעלי‪-‬אינדקס מחרוזתי‬
‫•מערכים רב‪-‬ממדיים‬
‫•מערכים של מערכים‬
‫חלק מהזכויות שמורות © אסף פוניס‪ ,‬רז מרק ודימה פרפורניק ‪2003-2005‬‬
‫ניתן להשתמש במצגת זאת לפי רישיון ‪ CC‬בכתובת‪:‬‬
‫‪http://creativecommons.org/licenses/by-nc-sa/2.5‬‬
‫‪1‬‬
‫רקע כללי‬
‫• מערכים הם למעשה משתנים המאחסנים בתוכם מספר‬
‫ערכים‪ .‬כאשר כל ערך מוכל ב"תא"‪.‬‬
‫• כל מערך מורכב משני אלמנטים‪ :‬ערך (המשתנה המוכל‬
‫בתא במערך)‪ ,‬ואינדקס (המסמל את התא)‪.‬‬
‫‪$countries‬‬
‫אינדקס‬
‫ערך‬
‫‪4‬‬
‫’‪‘us‬‬
‫‪3‬‬
‫’‪‘uk‬‬
‫‪2‬‬
‫’‪‘de‬‬
‫‪1‬‬
‫’‪‘cr‬‬
‫‪0‬‬
‫’‪‘ca‬‬
‫‪2‬‬
‫מערך פשוט‬
‫• ב‪ 0 ,PHP‬הוא מספר טבעי‪ ,‬ולכן המערכים‪ ,‬כברירת מחדל‪ ,‬הם‬
‫"מבוססי ‪ ,“0‬כלומר לתא הראשון במערך יש אינדקס ‪.0‬‬
‫• הגישה לערך במערך מתבצעת ע"י הרצף‪:‬‬
‫;]‪$var[index‬‬
‫‪$countries‬‬
‫ההפניה‬
‫ערך‬
‫]‪$countries [0] $countries [1] $countries [2] $countries [3] $countries [4‬‬
‫’‪‘us‬‬
‫’‪‘uk‬‬
‫’‪‘de‬‬
‫’‪‘cr‬‬
‫’‪‘ca‬‬
‫‪3‬‬
‫אתחול מערך‬
‫• בניגוד למשתנים רגילים‪ ,‬מערכים יש לאתחל לפני השימוש בהם‪.‬‬
‫נהוג לאתחל מערך בעזרת המבנה ) ( ‪ ,array‬כשמכניסים לסוגריים‬
‫את הערכים ההתחלתיים שיאוחסנו בו‪:‬‬
‫;)’‪$countries = array (‘ca’, ‘cr’, ‘de‬‬
‫‪$countries‬‬
‫]‪$countries [0] $countries [1] $countries [2‬‬
‫’‪‘de‬‬
‫’‪‘cr‬‬
‫’‪‘ca‬‬
‫אם אין ברצוננו לתת למערך ערכים התחלתיים‪ ,‬נרשום פשוט‬
‫;)(‪ .$countries = array‬רישום זה הוא מינימלי‪ ,‬אך הכרחי בכל הגדרת‬
‫‪4‬‬
‫מערך‪.‬‬
‫אתחול מערך‬
‫• אפשר גם לבחור את האינדקס שממנו תתחיל הספירה של‬
‫האינדקסים בסדר עולה‪ ,‬גם כאשר אין מדובר על האינדקס הראשון‪:‬‬
‫;)’‪$countries = array (1=>’cr’, 3=>’uk’, ‘us‬‬
‫‪$countries‬‬
‫]‪$countries [3] $countries [4‬‬
‫]‪$countries [1‬‬
‫’‪‘uk‬‬
‫’‪‘cr‬‬
‫’‪‘us‬‬
‫‪5‬‬
‫אתחול מערך‬
‫• להוספת ערכים למערך מוגדר‪ ,‬נכתוב‪:‬‬
‫;’‪$countries []=‘ca‬‬
‫ההוראה הנ"ל מוסיפה למערך את הערך ’‪ ‘ca‬בתא הראשון*‬
‫שאין בו ערך עדיין‪ .‬במקרה זה‪.index 0 ,‬‬
‫‪$countries‬‬
‫]‪$countries [0‬‬
‫’‪‘ca‬‬
‫*אחרי האינדקס הגבוה ביותר שנעשה בו שימוש‬
‫‪6‬‬
‫אתחול מערך‬
‫• אפשר לפרט בדיוק את התא אליו רוצים להכניס את‬
‫הערך‪.‬‬
‫;’‪$countries [3]=‘uk‬‬
‫‪$countries‬‬
‫]‪$countries [3‬‬
‫]‪$countries [0‬‬
‫’‪‘uk‬‬
‫’‪‘ca‬‬
‫‪7‬‬
‫אתחול מערך‬
‫• כעת אם נרשום‪:‬‬
‫;’‪$countries []=‘us‬‬
‫יתווסף הערך באופן אוטומטי אחרי האינדקס הגדול ביותר‬
‫שנעשה בו שימוש‪.‬‬
‫‪$countries‬‬
‫]‪$countries [3] $countries [4‬‬
‫]‪$countries [0‬‬
‫’‪‘uk‬‬
‫’‪‘ca‬‬
‫’‪‘us‬‬
‫‪8‬‬
‫ריצה על מערך פשוט‬
‫• בכדי לרוץ על מערך ("מבוסס ‪ - "0‬בעל אינדקסים טבעיים)‪,‬‬
‫נרשום‪:‬‬
‫;)’‪$countries = array (‘cr’, ‘de’, ‘us‬‬
‫;)‪$num_elements = count ($countries‬‬
‫)‪for ($idx=0; $idx < $num_elements; $idx++‬‬
‫הדפס כל ערך בשורה נפרדת ‪//‬‬
‫הפונקציה ) ( ‪count‬‬
‫;“‪echo $countries [$idx] ."<br />\n‬‬
‫מונה את מספר‬
‫הערכים במערך‬
‫‪9‬‬
‫ריצה על מערך פשוט‬
‫• דוגמה חשובה ‪ -‬מיון בועות‪:‬‬
‫נציג כעת קטע תוכנית חשוב‪ ,‬הממיין מערך חד מימדי בעל ערכים ממשיים‪,‬‬
‫בשיטה שנקראת "מיון בועות"‪:‬‬
‫חשוב לזכור ולהבין‬
‫דוגמה זו‪ ,‬כדי להשתמש‬
‫ביעילות ובחכמה‬
‫במערכים ובריצה עליהם‪.‬‬
‫‪// bubble sort for $ar‬‬
‫)‪for($i=count($ar)-1;$i<=0;$i--‬‬
‫{ )‪for($j=0;$j<$i;$j++‬‬
‫{ )]‪if($ar[$j]>$ar[$j+1‬‬
‫;]‪$ezer=$ar[$j‬‬
‫;]‪$ar[$j]=$ar[$j+1‬‬
‫;‪$ar[$j+1]=$ezer‬‬
‫‪} //if‬‬
‫‪} //for j‬‬
‫‪10‬‬
‫ריצה על מערך פשוט‬
‫• נציג את הפונקצייה ‪ ,print_r‬שמציגה את הפרטים המלאים אודות כל‬
‫מערך שהוא‪:‬‬
‫‪<?php‬‬
‫;)‪$ar=array(1,2,’dimka’,7‬‬
‫;‪$ar[6]=true‬‬
‫;’‪$ar[‘my_index’]=‘xyz‬‬
‫;)‪print_r($ar‬‬
‫;’‪$ar[]=‘true‬‬
‫>?‬
‫פונקצייה זו מקבלת מערך ומדפיסה את כל המידע אודותיו‪ :‬מאפיינים‪,‬‬
‫אינדקסים‪ ,‬וערכים‪.‬‬
‫‪11‬‬
‫מערכים בעלי אינדקס מחרוזתי‬
PHP‫ אך ב‬,‫ בכל המערכים שראינו האינדקס היה מספרי וטבעי‬,‫• עד כה‬
‫ ועליו ניתן‬.string ‫ כלומר‬,‫יש אפשרות שהאינדקס יהיה גם מחרוזתי‬
.‫להפעיל את כל הפעולות שביצענו על מערך פשוט‬
$countries [‘ca’] = ‘Canada’;
$countries [‘cr’] = ‘Costa Rica’;
$countries [‘de’] = ‘Germany’;
$countries [‘uk’] = ‘United Kingdom’;
$countries [‘us’] = ‘United States’;
$countries [‘ca’]
‘Canada’
12
$countries [‘cr’]
‘Costa Rica’
$countries [‘de’]
‘Germany’
$countries [‘uk’]
‘United Kingdom’
$countrie[’us’]
‘United States’
‫מערכים בעלי אינדקס מחרוזתי‬
:‫• או בצורה שונה‬
$countries = array ( ‘ca’ => ‘Canada’, ‘cr’ =>’Costa Rica’,’de’
=> ‘Germany’,’uk’=>’United Kingdom’, ‘us’=>’United
States’);
$countries [‘ca’]
‘Canada’
13
$countries [‘cr’]
‘Costa Rica’
$countries [‘de’]
‘Germany’
$countries [‘uk’]
‘United Kingdom’
$countrie[’us’]
‘United States’
‫מערכים בעלי אינדקס מחרוזתי‬
‫• הערה חשובה‬
‫כפי שנאמר בהרצאות הקודמות‪ ,‬קיים הבדל בין ‪ ,1‬המייצג מספר ובין ’‪‘1‬‬
‫המייצג מחרוזת‪ .‬אולם‪ ,‬הבדל זה אינו מורגש באינקדסים של מערכים(!)‪:‬‬
‫לכן חשוב מאוד שלא יוגדרו במערך‬
‫אינקדסים מחרוזתיים ואינדקסים‬
‫מספריים ש'נראים' אותו דבר‪ .‬לא‬
‫מומלץ להשתמש באינקדסים כגון‬
‫’‪ ,‘1’,’2’,’22000‬אלא רק באלה‬
‫מהסוג ‪.1,2,22000‬‬
‫שימוש נבון מסוג זה מבטיח עבודה‬
‫"תכנותית"‪.‬‬
‫‪<?php‬‬
‫;)(‪$ar=array‬‬
‫;‪$ar[0]=2‬‬
‫;’‪$ar[‘0’]=‘polka dots‬‬
‫‪echo $ar[0]; //prints polka dots‬‬
‫;’‪$ar[0]=‘something‬‬
‫‪echo $ar[‘0’]; //prints something‬‬
‫>?‬
‫‪14‬‬
‫מערכים בעלי אינדקס מחרוזתי‬
‫• לולאת ‪foreach‬‬
‫ראינו כי על מערכים עם אינדקס מספרי ניתן לעבור ע"י לולאת ‪for‬‬
‫פשוטה‪ .‬כיצד עוברים אפוא על מערכים בעלי אינדקס מחרוזתי?‬
‫בעזרת הלולאה שונה הנוצרה רק לשם כך‪.foreach ,‬‬
‫תחביר הלולאה‪:‬‬
‫{ )‪foreach($ar as $idx=>$value‬‬
‫‪//statements‬‬
‫}‬
‫הלולאה עוברת על המערך ‪ ,$ar‬מהאינדקס הראשון שלו לאחרון‪,‬‬
‫שמתאחסן ב‪ ,$idx-‬לפי סדר הופעתם(לא משנה אם מספריים או‬
‫מחרוזתיים)‪ ,‬ומכניסה את ערך המערך באינדקס הנ"ל‪ ,‬לתוך המשתנה ‪15‬‬
‫‪.$value‬‬
‫מערכים בעלי אינדקס מחרוזתי‬
foreach ‫• לולאת‬
:‫דוגמה‬
$ar=array(‘first’=>’TV’,’second’=>’keyboard’,’third’=>’5shekels’);
print_r($ar); echo “<hr /><br />”;
foreach($ar as $index=>$myval) {
echo $myval.” is in index num ”.$index .”<br />\n”;
$ar[$index]=‘loser’;
}
echo “<hr />”; print_r($ar); echo “<br />”;
16
‫מערכים בעלי אינדקס מחרוזתי‬
‫• לולאת ‪foreach‬‬
‫בדוגמה זו יתקבל‪:‬‬
‫‪17‬‬
‫מערכים בעלי אינדקס מחרוזתי‬
‫• לולאת ‪foreach‬‬
‫חשוב לציין כי לא חובה לכלול בלולאת ה‪ foreach‬את משתנה האינדקס‬
‫והיא תעבוד מצויין גם בלעדיו‪:‬‬
‫;)’‪$ar=array(‘first’=>’TV’,’second’=>’keyboard’,’third’=>’5shekels‬‬
‫)‪foreach($ar as $myval‬‬
‫;”‪echo $myval.” is next in line <br />\n‬‬
‫במשתנה האינדקס משתמשים בעיקר כאשר רוצים לשנות את ערכי‬
‫המערך באמצע הלולאה(למרות שיש דרך נוספת לעשות זאת)‪.‬‬
‫‪18‬‬
‫מערכים רב מימדיים‬
‫• ניתן להגדיר מערכים דו מימדיים‪:‬‬
‫)‪for ($i=0; $i<4; $i++‬‬
‫)‪for ($j=0; $j<5;$j++‬‬
‫;‪$ar [$i] [$j] = $i‬‬
‫הצגת המערך בטבלה(אותה ניתן להדפיס בעזרת ‪ 2‬לולאות באופן‬
‫דומה)‪ ,‬תראה‪:‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪2‬‬
‫‪2‬‬
‫‪2‬‬
‫‪2‬‬
‫‪2‬‬
‫‪3‬‬
‫‪3‬‬
‫‪3‬‬
‫‪3‬‬
‫‪3‬‬
‫שימו לב לסדר האינדקסים!!!שורה‪-‬ראשון‪ .‬עמודה‪-‬שני‪.‬‬
‫‪19‬‬
‫מערכים רב מימדיים‬
‫• אם נדפיס את המערך הנתון בעזרת ‪ ,print_r‬נקבל‪:‬‬
‫‪20‬‬
‫מערכים רב מימדיים‬
‫• באותה צורה בדיוק ניתן להגדיר מערך רב מימדי‪:‬‬
‫)‪for ($i=0; $i<4;$i++‬‬
‫)‪for ($j=0; $j<5; $j++‬‬
‫)‪for ($t=0; $t<20; $t++‬‬
‫)‪for ($p=20; $p>-7; $p--‬‬
‫;‪$ar[$i][$j][$t][$p]=$i*$t-$p*$j‬‬
‫וכו'‪...‬‬
‫אולם לא סביר שתזדקקו למערך בעל יותר משלושה מימדים(שגם בו תיתקלו‬
‫לעיתים מאוד רחוקות)‪ .‬לא מומלץ להגדיר מערכים בעלי מימדים רבים‪,‬‬
‫מכל סיבה שהיא‪ ,‬ואם עשיתם כן‪ ,‬ככל הנראה זה מיותר‪.‬‬
‫‪21‬‬
‫מערכים של מערכים‬
‫• לתאים הנמצאים בכל מערך נתון ניתן להכניס כל משתנה שנרצה‪ .‬בפרט‪,‬‬
‫כל תא במערך הנ"ל יכול להיות מערך בפני עצמו‪ .‬לדוגמה‪:‬‬
‫‪// inner arrays‬‬
‫;)‪$in_ar=array(1,2,3‬‬
‫;)’‪$in_ar2=array(‘moshe’,’danny’,’yossi‬‬
‫;)‪$ar=array($in_ar,$in_ar2‬‬
‫;)‪print_r($ar‬‬
‫‪22‬‬
‫מערכים של מערכים‬
‫• חשוב להבין ש‪-‬מערכים של מערכים ומערכים רב מימדיים הם אותו‬
‫הדבר‪ .‬לעתים נוח יהיה לנו לאתחל(ולהתייחס אינטואיטיבית) מערך‬
‫מסובך כמערך רב מימדי‪:‬‬
‫)‪for($i=0;$i<10;$i++‬‬
‫)‪for($j=0;$j<10;$j++‬‬
‫;‪$ar[$i][$j]=$j-$i‬‬
‫•‬
‫ולעתים כמערך של מערכים‪:‬‬
‫;)’‪$ar1=array(‘dog’,’cat’,’sheep‬‬
‫)‪$ar2=array(9,20,78,-200.6‬‬
‫;)‪$ar=array($ar1,$ar2‬‬
‫‪23‬‬