إدراج عنصر في مصفوفة PHP: شرح داخلي مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

إدراج عنصر في مصفوفة PHP: نظرة تحت الغطاء

\n\n

تخيل أنك تكتب سكريبت PHP لمتجر إلكتروني. وصل منتج جديد وتحتاج وضعه تمامًا بين "الهواتف الذكية" و"أجهزة الكمبيوتر المحمولة". أو أنك تقوم بتحليل بيانات وتحتاج إدراج سطر في منتصف ملف CSV. موقف مألوف؟ سؤال "إدراج عنصر جديد في مصفوفة PHP في أي موضع" حصد آلاف المشاهدات على Stack Overflow. وليس من المستغرب: لا توجد دالة مدمجة في PHP باسم "insert element by index". لكن هناك أدوات قوية تسمح لك بذلك بشكل أنيق وفعال. دعنا نفهم كيف يعمل هذا تحت الغطاء.

\n\n

لماذا لا توجد دالة insert() بسيطة في PHP؟

\n\n

على عكس JavaScript (حيث توجد splice()) أو Python (list.insert())، فإن مصفوفات PHP هي هجين: فهي في نفس الوقت قائمة وجدول تجزئة. عندما تقوم بإدراج عنصر في المنتصف، لا تحتاج PHP فقط إلى تحريك المؤشرات، بل إلى إعادة بناء الهيكل الداخلي للبيانات. لهذا السبب لم يضيف المطورون دالة بنفس الاسم، بل قدموا أداة شاملة — array_splice(). هذه الأداة تحل 99% من المشاكل، لكن من المهم فهم منطقها الداخلي.

\n\n

الطريقة الأصح: array_splice()

\n\n

هذه هي البطل الرئيسي في مقالتنا. الدالة array_splice() لا تقوم فقط بحذف جزء من المصفوفة، بل يمكنها أيضًا إدراج عناصر جديدة مكانها. والأفضل من ذلك، أنها تفعل ذلك دون إنشاء مصفوفة جديدة — التغييرات تحدث "في نفس المكان" (بالإشارة).

\n\n
<?php\n$fruits = ['تفاح', 'موز', 'كرز', 'تمر'];\n// إدراج 'عنب' في الموضع 2 (بعد 'موز')\narray_splice($fruits, 2, 0, 'عنب');\nprint_r($fruits);\n// النتيجة: ['تفاح', 'موز', 'عنب', 'كرز', 'تمر']\n?>
\n\n

الصيغة: array_splice(&$array, $offset, $length, $replacement). المعامل الثالث ($length) يساوي صفر — وهذا يعني أننا لا نحذف شيئًا، بل نقوم فقط بالإدراج. المعامل الرابع يمكن أن يكون عنصرًا واحدًا أو مصفوفة من العناصر.

\n\n

تحت الغطاء: عندما تستدعي array_splice() بطول صفري، تقوم PHP بما يلي:

\n
    \n
  • تحدد المؤشر الداخلي إلى الموضع $offset.
  • \n
  • توسع المصفوفة: جميع العناصر من الموضع إلى النهاية تتحرك إلى اليمين.
  • \n
  • في المساحة الفارغة، تقوم بإدراج العنصر الجديد (أو العناصر).
  • \n
  • تعيد فهرسة المفاتيح الرقمية (إذا كانت موجودة).
  • \n
\n\n

هام: هذه العملية تتم بتعقيد O(n) — كلما كانت المصفوفة أكبر وكلما كان الإدراج أقرب إلى البداية، زاد عدد العناصر التي يجب تحريكها. بالنسبة لـ 99% من تطبيقات الويب، هذا غير ملحوظ، لكن إذا كنت تتعامل مع مصفوفات تحتوي على ملايين السجلات، يجب التفكير في بدائل.

\n\n

إدراج عدة عناصر

\n\n

هل تريد إدراج ثلاثة عناصر دفعة واحدة؟ فقط مرر مصفوفة:

\n\n
<?php\n$colors = ['أحمر', 'أخضر', 'أزرق'];\narray_splice($colors, 1, 0, ['أصفر', 'بنفسجي', 'برتقالي']);\nprint_r($colors);\n// ['أحمر', 'أصفر', 'بنفسجي', 'برتقالي', 'أخضر', 'أزرق']\n?>
\n\n

لاحظ: المصفوفة المُدرجة لا تصبح متداخلة — بل يتم "تفكيك" عناصرها وتوضع بشكل متسلسل.

\n\n

الإدراج اليدوي: عندما لا تناسبك array_splice

\n\n

أحيانًا تحتاج إلى الحفاظ على المصفوفة الأصلية دون تغيير. أو تريد إدراج عنصر دون تعديل البيانات الأصلية. هنا يأتي دور array_slice() والنسخ البسيط.

\n\n
<?php\nfunction insertIntoArray(array $original, int $position, mixed $element): array\n{\n    $before = array_slice($original, 0, $position);\n    $after  = array_slice($original, $position);\n    return array_merge($before, [$element], $after);\n}\n\n$arr = ['أ', 'ب', 'ج', 'د'];\n$newArr = insertIntoArray($arr, 2, 'س');\nprint_r($newArr); // ['أ', 'ب', 'س', 'ج', 'د']\n// $arr تبقى دون تغيير\n?>
\n\n

ماذا يحدث تحت الغطاء؟ array_slice() تنشئ مصفوفتين جديدتين — هذا نسخ

المدونات

توصيات الكتب