Menu

array_merge() ב-PHP: מיזוג שני מערכים או יותר

array_merge($a, $b) מחברת מערכים לאחד: ערכים עם מפתחות מספריים מתווספים וממוספרים מחדש, ובמפתחות מחרוזת המערך המאוחר מנצח. למדו במה array_merge שונה מהאופרטור + ומתחביר הפריסה [...$a, ...$b], איך ממזגים רשימה של מערכים, ומתי array_merge_recursive או array_replace מתאימות יותר.

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

array_merge($a, $b) מחזירה מערך חדש עם האיברים של $a ואחריהם האיברים של $b. מפתחות מספריים ממוספרים מחדש מ-0; כששני המערכים מכילים אותו מפתח מחרוזת, הערך מהמערך המאוחר מנצח. העבירו כמה מערכים שתרצו.

array_merge() לא משנה את הארגומנטים שלה. היא מחזירה את המערך המאוחד, אז הציבו את התוצאה: $all = array_merge($all, $more);.

מפתחות מספריים ממוספרים מחדש

array_merge() מתייחסת למפתחות שלמים כמיקומים, לא כשמות. כל איבר עם מפתח שלם מתווסף ומקבל מפתח חדש מ-0, גם אם המערכים השתמשו באותם מספרים או בפערים. זה מה שרוצים ברשימות, והפתעה כשהמספרים הם מזהים.

מפתחות מחרוזת שנראים כמו מספרים שלמים ('101') נשמרים כמספרים שלמים, ולכן גם הם ממוספרים מחדש. מפתחות כמו 'id101' נשארים כמו שהם.

array_merge מול האופרטור +

גם האופרטור + (איחוד מערכים) מחבר מערכים, אבל עם הכלל ההפוך: לכל מפתח שכבר קיים במערך הראשון, הערך הראשון מנצח והערך מהמערך השני נזרק. הוא אף פעם לא ממספר מחדש. זה הופך את + לדרך הטבעית להשלים ברירות מחדל, ואת array_merge() לדרך הטבעית לדרוס אותן.

array_merge($a, $b)$a + $b
אותו מפתח מחרוזתהערך מ-$bהערך מ-$a
מפתחות שלמיםממוספרים מחדש, כל הערכים נשמריםנשמרים, $b מפסיד בהתנגשויות
שימוש טיפוסיחיבור רשימות, דריסת הגדרותהשלמת ברירות מחדל, שמירת מזהים

הדוגמה האחרונה בבלוק היא המלכודת הקלאסית של +: ['a', 'b'] + ['x', 'y', 'z'] נותן a, b, z, כי המפתחות 0 ו-1 כבר קיימים במערך הראשון.

תחביר פריסה: [...a,...a, ...b]

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

כדי להוסיף מערך למערך קיים במקום, ראו את array_push() עם אופרטור הפריסה.

מיזוג מערך של מערכים

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

כתיבה של $all = array_merge($all, $batch); בתוך הלולאה עובדת, אבל היא מעתיקה את כל המערך הגדל בכל סבב, וזה נעשה איטי עם אלפי פריטים.

array_merge_recursive ו-array_replace

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

קראו את שלוש שורות ה-JSON מלמעלה למטה: array_merge() החליפה את כל המערך db ואיבדה את host, array_merge_recursive() הפכה את port ואת debug לרשימות של שני איברים, ו-array_replace_recursive() הפיקה את ההגדרות שהתכוונתם אליהן.

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

array_merge() שומרת ערכים כפולים שיושבים תחת מפתחות שונים. מיזוג של שתי רשימות תגיות נותן לכם כל תגית משותפת פעמיים. העבירו את התוצאה דרך array_unique() ואז array_values() כדי למספר אותה מחדש.

עמוד array_unique מכסה הסרת כפילויות משורות וממערכים מקוננים.

שאלות נפוצות

מה ההבדל בין array_merge ל-+ ב-PHP?

במפתחות מחרוזת כפולים, array_merge($a, $b) שומרת את הערך מ-$b, בעוד $a + $b שומר את הערך מ-$a. במפתחות מספריים, array_merge() מוסיפה וממספרת הכול מחדש, בעוד + שומר את המפתחות המספריים ומשמיט כל איבר של $b שהמפתח שלו כבר קיים ב-$a.

איך ממזגים מערכים ושומרים על המפתחות המספריים?

השתמשו ב-$a + $b אם המערך הראשון צריך לנצח, או ב-array_replace($a, $b) אם המערך השני צריך לנצח. array_merge() תמיד ממספרת מפתחות מספריים מחדש מ-0.

איך ממזגים מערך של מערכים ב-PHP?

פרסו את המערך החיצוני לתוך array_merge(): $all = array_merge(...$lists);. היא מחזירה [] לרשימה ריקה. אספו קודם את המערכים בלולאה ומזגו פעם אחת בסוף; קריאה ל-array_merge() בתוך הלולאה מעתיקה את התוצאה הגדלה בכל פעם.

אפשר להשתמש באופרטור הפריסה עם מפתחות מחרוזת ב-PHP?

כן, מאז PHP 8.1. [...$a, ...$b] מתנהג אז כמו array_merge($a, $b): מפתחות מספריים ממוספרים מחדש ומפתח מחרוזת מאוחר דורס מפתח מוקדם.

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

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

להתחיל