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); });.