מערך ב-PHP שומר רשימת ערכים תחת מפתחות. יוצרים אותו עם סוגריים מרובעים, $fruits = ['apple', 'banana', 'cherry'];, וקוראים איבר לפי האינדקס שלו, $fruits[0]. האינדקסים מתחילים ב-0, ו-count($fruits) נותנת את מספר האיברים.
כל מערך ב-PHP הוא מפה מסודרת: כל ערך יושב תחת מפתח. כשלא בוחרים את המפתחות, PHP ממספרת אותם 0, 1, 2... ומקבלים מערך עם אינדקסים. כשבוחרים אותם בעצמכם (['name' => 'Ada']), מקבלים מערך אסוציאטיבי. שניהם אותו טיפוס array.
יצירת מערך
סוגריים מרובעים הם התחביר הרגיל. array() הוא הכתיב הישן ומפיק בדיוק את אותו הדבר. range() בונה רשימה של מספרים או אותיות, ו-array_fill() חוזרת על ערך אחד.
מערך ב-PHP יכול להחזיק ערכים מטיפוסים שונים בבת אחת, כולל מערכים אחרים. מערך של מערכים הוא מערך רב ממדי, הדרך הרגילה להחזיק שורות של נתונים.
קבלת האיבר הראשון והאחרון
אין ב-PHP אינדקסים שליליים. $arr[-1] לא אומר "האחרון": הוא מחפש מפתח בשם -1, וכשאין כזה, PHP מדפיסה Warning: Undefined array key -1. השתמשו ב-array_key_first() וב-array_key_last(), שעובדות גם כשהמפתחות לא מתחילים ב-0.
גם end($queue) מחזירה את הערך האחרון, אבל היא מזיזה את המצביע הפנימי של המערך כתופעת לוואי, ולכן הגרסה שמבוססת על מפתחות היא הבחירה הברורה יותר.
הדפסת מערך
echo $arr לא עובד: הוא מדפיס את המילה Array ואזהרה. בחרו את הפלט שמתאים לעבודה:
print_r($arr)לפלט קריא בזמן דיבאג.var_dump($arr)כדי לראות גם את הטיפוס והאורך של כל ערך.implode(', ', $arr)כדי להפוך את הערכים למחרוזת אחת לתצוגה.json_encode($arr)כדי לשלוח את המערך ל-JavaScript או ל-API.
עמוד print_r ו-var_dump מכסה את אפשרויות העיצוב, כולל הדפסת מערך בתוך HTML.
מעבר על מערך בלולאה
foreach היא הלולאה שנבנתה למערכים: היא נותנת לכם כל ערך, וגם את המפתח אם מבקשים. לולאת for עם אינדקס עובדת גם היא למערכים עם אינדקסים שהמפתחות שלהם רצים מ-0 בלי פערים.
מערכים מועתקים, לא משותפים
הצבה של מערך למשתנה אחר, או העברה שלו לפונקציה, נותנת עותק. שינוי העותק משאיר את המקור כמו שהוא. הוסיפו & לפרמטר כשפונקציה צריכה לשנות את המערך של הקורא.
פונקציות מערך לפי משימה
PHP מגיעה עם יותר מ-70 פונקציות מערך. אלה הפונקציות שתשתמשו בהן הכי הרבה, ולכל אחת יש עמוד משלה:
| משימה | פונקציה |
|---|---|
| הוספה לסוף | array_push() או $arr[] = |
| מספר האיברים | count() |
| בדיקה אם ערך קיים | in_array() |
| מציאת המפתח של ערך | array_search() |
| בדיקה אם מפתח קיים | array_key_exists() |
| חיבור מערכים | array_merge() |
| שינוי כל ערך | array_map() |
| שמירה של חלק מהערכים | array_filter() |
| מיון | sort(), usort() והחברים שלהן |
| הסרת איבר | unset(), array_splice() |
| לקיחת חלק | array_slice() |
| הסרת כפילויות | array_unique() |
| ממחרוזת למערך ובחזרה | explode(), implode() |
מפתחות שמתמזגים בשקט
מפתחות מערך הם מספרים שלמים או מחרוזות, ו-PHP ממירה חלק מהמפתחות בשבילכם. מחרוזת שנראית כמו מספר עשרוני שלם, כמו "1", הופכת למספר השלם 1, ולכן $a["1"] ו-$a[1] הם אותו מקום. "01" ו-"1.5" נשארים מחרוזות. זו הסיבה שמערך שנבנה מקלט של טופס או מ-CSV יכול להגיע עם פחות איברים ממה שציפיתם.
שאלות נפוצות
איך יוצרים מערך ב-PHP?
השתמשו בסוגריים מרובעים: $colors = ['red', 'green', 'blue'];. מערך ריק הוא $items = [];. התחביר הישן array('red', 'green') עושה את אותו הדבר ועדיין עובד.
איך מדפיסים מערך ב-PHP?
echo לא יכולה להדפיס מערך (היא מדפיסה את המילה Array ואזהרה). השתמשו ב-print_r($arr) לפלט קריא, ב-var_dump($arr) כדי לראות גם טיפוסים, או ב-echo implode(', ', $arr) כדי להדפיס את הערכים בשורה אחת.
איך מקבלים את האיבר האחרון של מערך ב-PHP?
השתמשו ב-$arr[array_key_last($arr)] (PHP 7.3 ומעלה) או ב-end($arr). אין ב-PHP אינדקסים שליליים: $arr[-1] מחפש מפתח בשם -1, שבדרך כלל לא קיים.
האם מערכים ב-PHP מועברים לפי ערך או לפי הפניה?
לפי ערך. $b = $a; נותן ל-$b עותק משלו, ולכן שינוי של $b לא משנה את $a. כדי לשנות את המערך של הקורא בתוך פונקציה, הגדירו את הפרמטר כהפניה: function add(array &$list).
מה ההבדל בין מערך עם אינדקסים למערך אסוציאטיבי ב-PHP?
זה אותו טיפוס. למערך עם אינדקסים יש מפתחות שלמים 0, 1, 2... ש-PHP מקצה בשבילכם; מערך אסוציאטיבי משתמש במפתחות שאתם בוחרים, בדרך כלל מחרוזות כמו 'name'. מערך אחד יכול אפילו לערבב את שניהם.