تخزّن المصفوفة الترابطية كل قيمة تحت مفتاح تختاره، مكتوبة على شكل key => value: $user = ['name' => 'Ada', 'age' => 36];. اقرأ قيمة بـ $user['name']، وأضف قيمة أو غيّرها بالإسناد إلى مفتاحها: $user['email'] = 'ada@example.com';.
في لغات أخرى تُسمى البنية نفسها قاموسًا أو خريطة أو جدول تجزئة. وفي PHP هي مصفوفة عادية مفاتيحها نصوص بدل 0, 1, 2.
إضافة الأزواج وتغييرها وحذفها
الإسناد إلى مفتاح غير موجود يضيفه في النهاية. والإسناد إلى مفتاح موجود يستبدل قيمته ويُبقي موضعه. وتحذف unset() زوجًا.
لا تفيد array_push() هنا: فهي لا تستطيع إلا إلحاق قيم بمفاتيح رقمية. لإضافة عدة أزواج معًا، استخدم array_merge($stock, $more)، حيث تفوز القيم الجديدة، أو $stock + $more، حيث تحتفظ المفاتيح الموجودة بقيمها؛ وتقارن صفحة array_merge بين الاثنين.
المرور على المفاتيح والقيم
تمر foreach ($array as $key => $value) على الأزواج بترتيب إضافتها. احذف $key => عندما لا تحتاج إلا إلى القيم.
الحصول على كل المفاتيح أو كل القيم
تعيد array_keys() المفاتيح قائمةً عادية وتعيد array_values() القيم، وكلتاهما مُعاد فهرستها من 0. وأعطِ array_keys() وسيطًا ثانيًا فتعيد فقط المفاتيح التي تحمل تلك القيمة، وهكذا تجد كل مفتاح لقيمة ما.
لمفتاح واحد، تعيد array_search() أول تطابق، أو false عندما لا يوجد. وتشرح صفحة array_search لماذا يجب أن تقارن تلك النتيجة بـ !== false.
التحقق من وجود مفتاح
isset($arr['key']) هو الفحص المعتاد والأسرع، لكنه يعيد false عندما يكون المفتاح موجودًا ويحمل null. أما array_key_exists('key', $arr) فتعيد true في هذه الحالة. وللقراءة مع قيمة بديلة، يفعل العامل ?? الأمرين معًا.
الترتيب حسب المفتاح أو القيمة
ترتّب ksort() حسب المفتاح وترتّب asort() حسب القيمة، وكلتاهما تُبقي كل مفتاح مرتبطًا بقيمته. وترتّب krsort() وarsort() ترتيبًا عكسيًا. لا تستخدم sort() على مصفوفة ترابطية: فهي ترمي المفاتيح وتعيد الترقيم من 0.
كل هذه الدوال ترتّب في المكان نفسه وتعيد true، لذا فإن $sorted = ksort($arr) تعطيك true لا مصفوفة. والترتيبات المخصصة تستخدم uasort() وuksort().
القلب والعدّ والتحويل إلى JSON
بعض الأسطر القصيرة تتكرر كثيرًا مع بيانات المفتاح والقيمة: تبادل array_flip() بين المفاتيح والقيم، وتعدّ array_count_values() مرات ظهور كل قيمة، وتحوّل json_encode() المصفوفة إلى كائن JSON.
خطأ شائع: قراءة مفتاح غير موجود
قراءة مفتاح مفقود تعيد null، لكن PHP لديك تطبع تحذيرًا أيضًا:
<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3
أعطِ القراءة قيمة افتراضية بـ ??، الذي لا يحذّر أبدًا، أو افحص بـ isset() أولًا عندما تحتاج الحالة المفقودة إلى فرع خاص بها.
داخل نص بين علامتي تنصيص مزدوجتين، ضع البحث بين أقواس معقوصة، "{$user['email']}". ومن دونها لا تقبل PHP إلا الصيغة دون علامات تنصيص "$user[email]"، وهي سهلة الخطأ.
الأسئلة الشائعة
كيف أنشئ مصفوفة ترابطية في PHP؟
اكتب كل زوج على شكل key => value داخل أقواس مربعة: $prices = ['apple' => 1.2, 'pear' => 0.9];. واقرأ قيمة بـ $prices['apple'].
كيف أرتّب مصفوفة ترابطية حسب المفتاح في PHP؟
استدعِ ksort($arr); للترتيب من A إلى Z أو krsort($arr); من Z إلى A. كلتاهما ترتّب في المكان نفسه، وتُبقي كل قيمة مع مفتاحها، وتعيد true لا المصفوفة المرتبة.
كيف أمر على مصفوفة ترابطية في PHP؟
استخدم foreach مع المتغيرين: foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }. تخرج الأزواج بترتيب إضافتها.
كيف أحصل على كل مفاتيح مصفوفة ترابطية؟
تعيد array_keys($arr) المفاتيح مصفوفةً مفهرسة، وتعيد array_values($arr) القيم. وتعيد array_keys($arr, $value) فقط المفاتيح التي تساوي قيمتها $value.
هل تحافظ المصفوفة الترابطية في PHP على ترتيب الإدراج؟
نعم. مصفوفات PHP خرائط مرتبة، لذا ترى foreach وprint_r وjson_encode الأزواج بالترتيب الذي أدرجتها به، حتى ترتّب المصفوفة بـ ksort() أو asort() أو دالة مشابهة.