Menu
flag Ar iconالعربيةdown icon

الدالة 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

ابدأ الآن