إضافة عناصر إلى مصفوفة فارغة في PHP: ماذا يحدث تحت الغطاء؟

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

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

ابدأ الدورة

سحر الحاوية الفارغة: كيف تجعل PHP تعمل لصالحك

\n\n

تخيل: أنت تكتب سكريبت PHP وتحتاج إلى جمع بيانات — مثل معرفات المنتجات من سلة التسوق. تقوم بإنشاء مصفوفة فارغة، ثم تضيف إليها عناصر داخل حلقة. قد يبدو الأمر بسيطًا، لكن هذه اللحظة — إضافة عناصر إلى مصفوفة PHP فارغة — تثير آلاف الأسئلة على Stack Overflow. لماذا؟ لأن المبتدئين غالبًا ما يخلطون بين الصيغ، بينما يريد المطورون المحترفون فهم ما يحدث "تحت الغطاء".

\n\n

في هذه المقالة، لن نعرض فقط كيفية كتابة الكود بشكل صحيح. سننظر داخل نواة PHP (Zend Engine)، ونحلل الفرق بين $arr[] = $value و array_push()، ونكتشف المفاجآت التي يخبئها PHP 8.1. هل أنت مستعد؟ هيا بنا!

\n\n

السؤال الأكثر شيوعًا: كيف تضيف عنصرًا؟

\n\n

إذا كنت مبتدئًا، فمن المحتمل أن أول ما يخطر ببالك هو كتابة شيء مثل:

\n\n
<?php\n$myArray = array(); // مصفوفة فارغة\n$myArray[] = 'العنصر الأول';\n$myArray[] = 'العنصر الثاني';\nprint_r($myArray);\n?>
\n\n

هذا الكود سيطبع:

\n\n
Array\n(\n    [0] => العنصر الأول\n    [1] => العنصر الثاني\n)
\n\n

هل يعمل؟ نعم. لكن لماذا؟ دعنا نحلل ما يفعله عامل التشغيل [] في الواقع.

\n\n

عامل التشغيل $arr[] = $value: سريع وأنيق

\n\n

عندما تكتب $arr[] = $value، فإن PHP لا يستدعي أي دوال. بدلاً من ذلك، يصل مباشرة إلى بنية البيانات الداخلية للمصفوفة (zend_array في مصطلحات Zend Engine).

\n\n

ماذا يحدث تحت الغطاء:

\n
    \n
  • يتحقق PHP مما إذا كانت المصفوفة موجودة. إذا لم تكن موجودة، يقوم بإنشاء واحدة جديدة (لكن من الأفضل دائمًا تهيئتها صراحة: $arr = []).
  • \n
  • يضيف العنصر إلى نهاية المصفوفة، مع تعيين المفتاح الرقمي التالي تلقائيًا (0، 1، 2...).
  • \n
  • إذا كانت المصفوفة فارغة — يحصل العنصر الأول على المفتاح 0.
  • \n
  • لا توجد تكاليف إضافية لاستدعاء الدوال. هذه هي الطريقة الأكثر كفاءة في الأداء.
  • \n
\n\n

نصيحة: استخدم $arr[] = ... دائمًا عندما تحتاج فقط إلى إضافة عنصر إلى النهاية. إنها سريعة وقابلة للقراءة ولا تتطلب استيراد دوال.

\n\n

array_push(): عندما تحتاج إلى إضافة عدة عناصر دفعة واحدة

\n\n

الطريقة الشائعة الثانية هي دالة array_push():

\n\n
<?php\n$myArray = [];\narray_push($myArray, 'الأول', 'الثاني', 'الثالث');\nprint_r($myArray);\n?>
\n\n

النتيجة ستكون نفسها. لكن هناك تفاصيل دقيقة:

\n
    \n
  • array_push() تأخذ المصفوفة كمرجع وتضيف جميع القيم الممررة إلى النهاية.
  • \n
  • ترجع العدد الجديد من العناصر في المصفوفة (بدءًا من PHP 7.3).
  • \n
  • تحت الغطاء: تستدعي الدالة الإجراء الداخلي zend_hash_next_index_insert لكل عنصر. هذا يعني أنه إذا كنت تضيف عنصرًا واحدًا، فإن array_push() تعمل بشكل أبطأ قليلاً من $arr[] = ... بسبب التكاليف الإضافية لاستدعاء الدالة.
  • \n
\n\n

متى تستخدم: فقط إذا كنت بحاجة إلى إضافة عدة عناصر دفعة واحدة (2 أو أكثر). لعنصر واحد — انسَ array_push واستخدم [].

\n\n

المصفوفة الفارغة والمفاتيح: ماذا لو كانت المفاتيح غير رقمية؟

\n\n

ماذا تفعل إذا كنت تريد إضافة عنصر بمفتاح محدد؟ على سبيل المثال، مصفوفة ترابطية:

\n\n
<?php\n$user = [];\n$user['name'] = 'أحمد';\n$user['age'] = 30;\n?>
\n\n

هنا أيضًا الأمر بسيط. عامل التشغيل [] مع مفتاح داخل الأقواس المربعة ($arr['key'] = value) يعمل كتعيين. إذا كان المفتاح غير موجود — يتم إنشاؤه. إذا كان موجودًا — يتم استبداله.

\n\n

لكن كن حذرًا: إذا كتبت بالخطأ $user[] = 'قيمة' بجانب مصفوفة ترابطية، سيضيف PHP مفتاحًا رقميًا

المدونات

توصيات الكتب