Menu

array_map() ב-PHP: הפעלת פונקציה על כל איבר

array_map($callback, $array) קוראת ל-callback על כל איבר ומחזירה מערך חדש של התוצאות. למדו פונקציות חץ, מפתחות, מיפוי של כמה מערכים בבת אחת, ומתי array_walk או foreach מתאימות יותר.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

array_map($callback, $array) קוראת ל-$callback על כל איבר של $array ומחזירה מערך חדש עם התוצאות. ה-callback בא ראשון, המערך שני, והמערך המקורי נשאר ללא שינוי.

fn($p) => $p * 1.2 היא פונקציית חץ: פונקציה של ביטוי אחד שמחזירה את התוצאה שלו. כל callable עובד במקומה.

שימוש בפונקציה מובנית כ-callback

העבירו את השם של פונקציה מובנית כמחרוזת. זו הדרך הקצרה ביותר לנקות מערך שלם: להפעיל trim על כל ערך, להמיר מחרוזות למספרים שלמים או לשנות רישיות.

array_map('intval', ...) היא הדרך הרגילה להפוך את המחרוזות מטופס או מ-explode() למספרים שלמים אמיתיים. אפשר גם לכתוב intval(...), תחביר ה-first-class callable מ-PHP 8.1, שהעורך שלכם יכול להשלים אוטומטית ולבדוק.

שימוש ב-closure עם משתנים מבחוץ

פונקציית חץ רואה את המשתנים שסביבה אוטומטית. function קלאסית צריכה use כדי להכניס אותם. שתיהן מוסברות בעמוד פונקציות אנונימיות.

array_map עם מפתחות

עם מערך יחיד, array_map שומרת על המפתחות, כולל מפתחות מחרוזת. אבל ה-callback מקבל רק את הערך. כדי לקבל גם את המפתח, העבירו array_keys($array) כמערך שני: ה-callback נקרא אז עם איבר אחד מכל מערך.

שימו לב לתוצאה השנייה: ברגע שמעבירים יותר ממערך אחד, המפתחות מוחלפים ב-0, 1, 2. לכן השורה האחרונה משתמשת ב-array_combine() כדי לבנות אותם מחדש.

מיפוי של כמה מערכים בבת אחת

כל מערך נוסף הופך לארגומנט נוסף של ה-callback, לפי מיקום. אם למערכים יש אורכים שונים, הקצרים מושלמים ב-null.

העברה של null כ-callback מדלגת על הפונקציה ומצמידה את המערכים לזוגות:

array_map מול array_walk מול foreach

array_map בונה מערך חדש. array_walk משנה את המערך שמעבירים לה, דרך הפניה, ונותנת ל-callback את המפתח כארגומנט השני. foreach עושה כל אחד מהם ויכולה גם לדלג על איברים או לעצור מוקדם עם break.

השתמשו ב-array_map כשכל איבר הופך לאיבר חדש אחד בדיוק. אם אתם צריכים גם להשמיט חלק מהאיברים, שלבו אותה עם array_filter, או כתבו foreach.

טעות נפוצה: סדר הארגומנטים

array_map מקבלת קודם את ה-callback ואחר כך את המערך. השכנה שלה array_filter מקבלת אותם בסדר ההפוך, וקל להתבלבל:

array_map($callback, $array);     // callback first
array_filter($array, $callback);  // array first

החלפה ביניהם גורמת ל-PHP 8 לזרוק TypeError, כי מערך רגיל אינו callback תקין:

PHP נעצרת עם:

PHP Fatal error:  Uncaught TypeError: array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members in /home/index.php:4

החליפו את שני הארגומנטים בחזרה והבלוק ירוץ.

שאלות נפוצות

מה array_map עושה ב-PHP?

היא קוראת לפונקציה על כל איבר במערך ומחזירה מערך חדש עם התוצאות: array_map(fn($n) => $n * 2, [1, 2, 3]) מחזירה [2, 4, 6]. המערך המקורי לא משתנה.

האם array_map שומרת על המפתחות?

עם מערך אחד, כן: מפתחות מחרוזת ומפתחות שלמים נשמרים כמו שהם. עם שני מערכים או יותר, התוצאה תמיד מקבלת מפתחות חדשים 0, 1, 2....

איך מקבלים את המפתח בתוך ה-callback של array_map?

העבירו את המפתחות כמערך שני: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). התוצאה היא רשימה, אז עטפו אותה ב-array_combine(array_keys($arr), ...) אם אתם צריכים את המפתחות המקוריים בחזרה.

האם array_map מהירה יותר מ-foreach?

לא באופן משמעותי. שתיהן עוברות על המערך פעם אחת, ו-foreach רגילה מהירה לעיתים קרובות מעט יותר כי היא חוסכת קריאה לפונקציה לכל איבר. בחרו ב-array_map כשהיא נקראת טוב יותר: שינוי אחד שמפיק מערך חדש.

מה ההבדל בין array_map ל-array_walk?

array_map מחזירה מערך חדש ולא נוגעת בקלט. array_walk מחזירה true ונועדה לשנות את המערך במקום דרך פרמטר הפניה: array_walk($arr, function (&$v, $k) { $v = trim($v); });.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל