أساسيات PHP

المصفوفات الترابطية

13 دقيقة الدرس 12 من 45

فهم المصفوفات الترابطية

المصفوفات الترابطية (تسمى أيضاً خرائط أو قواميس أو جداول التجزئة في اللغات الأخرى) تستخدم مفاتيح مسماة بدلاً من الفهارس الرقمية. كل مفتاح مرتبط بقيمة، مما يخلق أزواج مفتاح-قيمة تجعل البيانات أكثر معنى وسهولة في الوصول.

ملاحظة: في PHP، لا يوجد تمييز بين المصفوفات المفهرسة والترابطية على مستوى التنفيذ - كلاهما نفس هيكل البيانات. هذا يجعل مصفوفات PHP مرنة بشكل لا يصدق.

إنشاء المصفوفات الترابطية

أنشئ المصفوفات الترابطية بتحديد المفاتيح صراحة:

<?php // الطريقة 1: استخدام دالة array() $person = array( "name" => "John Doe", "age" => 30, "city" => "New York" ); // الطريقة 2: استخدام الصيغة المختصرة (موصى بها) $user = [ "username" => "johndoe", "email" => "john@example.com", "role" => "admin" ]; // الطريقة 3: إضافة العناصر واحداً تلو الآخر $product = []; $product["name"] = "Laptop"; $product["price"] = 999.99; $product["stock"] = 50; print_r($person); print_r($user); ?>
نصيحة: استخدم أسماء مفاتيح وصفية توضح بشكل واضح البيانات التي تمثلها. هذا يجعل كودك موثقاً ذاتياً.

الوصول إلى عناصر المصفوفة

الوصول إلى القيم باستخدام مفاتيحها بدلاً من الفهارس الرقمية:

<?php $book = [ "title" => "The Great Gatsby", "author" => "F. Scott Fitzgerald", "year" => 1925, "genre" => "Fiction" ]; // الوصول إلى العناصر الفردية echo $book["title"]; // الناتج: The Great Gatsby echo $book["year"]; // الناتج: 1925 // التحقق من وجود المفتاح if (isset($book["isbn"])) { echo $book["isbn"]; } else { echo "ISBN غير متاح"; } // التحقق من وجود المفتاح (بديل) if (array_key_exists("author", $book)) { echo "المؤلف: " . $book["author"]; } ?>
تحذير: تحقق دائماً من وجود المفتاح قبل الوصول إليه لتجنب تحذيرات "مفتاح المصفوفة غير محدد". استخدم isset() أو array_key_exists().

تعديل وإضافة العناصر

يمكنك تعديل القيم الموجودة أو إضافة أزواج مفتاح-قيمة جديدة:

<?php $car = [ "brand" => "Toyota", "model" => "Camry", "year" => 2020 ]; // تعديل عنصر موجود $car["year"] = 2022; // إضافة عنصر جديد $car["color"] = "Blue"; $car["mileage"] = 15000; print_r($car); /* Array ( [brand] => Toyota [model] => Camry [year] => 2022 [color] => Blue [mileage] => 15000 ) */ ?>

التكرار عبر المصفوفات الترابطية

استخدم foreach للتكرار عبر أزواج المفتاح-القيمة:

<?php $student = [ "name" => "Alice Johnson", "student_id" => "S12345", "major" => "Computer Science", "gpa" => 3.8 ]; // التكرار عبر القيم فقط foreach ($student as $value) { echo "$value<br>"; } // التكرار عبر المفاتيح والقيم (الأكثر شيوعاً) foreach ($student as $key => $value) { echo "$key: $value<br>"; } // الناتج: // name: Alice Johnson // student_id: S12345 // major: Computer Science // gpa: 3.8 ?>

دوال المصفوفات المفيدة

يوفر PHP العديد من الدوال خصيصاً للعمل مع المصفوفات الترابطية:

<?php $config = [ "host" => "localhost", "port" => 3306, "database" => "mydb", "username" => "root" ]; // الحصول على جميع المفاتيح $keys = array_keys($config); print_r($keys); // ["host", "port", "database", "username"] // الحصول على جميع القيم $values = array_values($config); print_r($values); // ["localhost", 3306, "mydb", "root"] // عد العناصر echo count($config); // 4 // التحقق من وجود المفتاح if (array_key_exists("password", $config)) { echo "كلمة المرور محددة"; } else { echo "كلمة المرور غير محددة"; } // إزالة عنصر unset($config["port"]); print_r($config); ?>

المصفوفات الترابطية المتداخلة

يمكن أن تحتوي المصفوفات الترابطية على مصفوفات أخرى، مما ينشئ هياكل بيانات معقدة:

<?php $company = [ "name" => "Tech Corp", "founded" => 2010, "employees" => [ [ "name" => "John Doe", "position" => "CEO", "salary" => 150000 ], [ "name" => "Jane Smith", "position" => "CTO", "salary" => 140000 ] ], "offices" => [ "headquarters" => [ "city" => "New York", "address" => "123 Main St" ], "branch" => [ "city" => "London", "address" => "456 High St" ] ] ]; // الوصول إلى العناصر المتداخلة echo $company["employees"][0]["name"]; // John Doe echo $company["offices"]["headquarters"]["city"]; // New York // التكرار عبر المصفوفات المتداخلة foreach ($company["employees"] as $employee) { echo "{$employee['name']} - {$employee['position']}<br>"; } ?>
نصيحة: استخدم المصفوفات الترابطية المتداخلة لتمثيل بيانات واقعية معقدة مثل استجابات API أو ملفات التكوين أو نتائج قواعد البيانات.

دمج المصفوفات

دمج مصفوفات ترابطية متعددة:

<?php $defaults = [ "theme" => "light", "language" => "en", "timezone" => "UTC" ]; $userSettings = [ "theme" => "dark", "notifications" => true ]; // دمج المصفوفات (القيم اللاحقة تستبدل القيم السابقة) $settings = array_merge($defaults, $userSettings); print_r($settings); /* Array ( [theme] => dark [language] => en [timezone] => UTC [notifications] => 1 ) */ // استخدام معامل + (القيم السابقة لها الأولوية) $settings2 = $userSettings + $defaults; print_r($settings2); /* Array ( [theme] => dark [notifications] => 1 [language] => en [timezone] => UTC ) */ ?>

ترتيب المصفوفات الترابطية

يوفر PHP عدة دوال لترتيب المصفوفات الترابطية:

<?php $prices = [ "apple" => 1.5, "banana" => 0.8, "cherry" => 2.5, "date" => 3.0 ]; // الترتيب حسب القيمة (تصاعدي) asort($prices); print_r($prices); // [banana => 0.8, apple => 1.5, cherry => 2.5, date => 3.0] // الترتيب حسب القيمة (تنازلي) arsort($prices); print_r($prices); // [date => 3.0, cherry => 2.5, apple => 1.5, banana => 0.8] // الترتيب حسب المفتاح (تصاعدي) ksort($prices); print_r($prices); // [apple => 1.5, banana => 0.8, cherry => 2.5, date => 3.0] // الترتيب حسب المفتاح (تنازلي) krsort($prices); print_r($prices); // [date => 3.0, cherry => 2.5, banana => 0.8, apple => 1.5] ?>
ملاحظة: دوال الترتيب تعدل المصفوفة في مكانها وترجع قيمة منطقية (صحيح/خطأ) للإشارة إلى النجاح، وليس مصفوفة جديدة.

مثال عملي: معالجة بيانات النموذج

<?php // محاكاة بيانات إرسال النموذج $formData = [ "first_name" => "John", "last_name" => "Doe", "email" => "john@example.com", "phone" => "", "message" => "Hello!" ]; // التحقق من الحقول المطلوبة $required = ["first_name", "last_name", "email"]; $errors = []; foreach ($required as $field) { if (empty($formData[$field])) { $errors[] = ucfirst(str_replace("_", " ", $field)) . " مطلوب"; } } if (empty($errors)) { echo "النموذج صالح!<br>"; // معالجة بيانات النموذج foreach ($formData as $key => $value) { if (!empty($value)) { echo ucfirst(str_replace("_", " ", $key)) . ": $value<br>"; } } } else { echo "أخطاء:<br>"; foreach ($errors as $error) { echo "- $error<br>"; } } ?>

مثال عملي: إدارة التكوين

<?php // تكوين قاعدة البيانات $dbConfig = [ "development" => [ "host" => "localhost", "database" => "dev_db", "username" => "dev_user", "password" => "dev_pass" ], "production" => [ "host" => "prod.server.com", "database" => "prod_db", "username" => "prod_user", "password" => "prod_pass" ] ]; // اختيار البيئة $environment = "development"; $db = $dbConfig[$environment]; echo "الاتصال بـ {$db['database']} في {$db['host']}<br>"; // دالة للحصول على قيمة التكوين مع القيمة الافتراضية function getConfig($config, $key, $default = null) { return $config[$key] ?? $default; } echo getConfig($db, "host"); // localhost echo getConfig($db, "port", 3306); // 3306 (افتراضي) ?>
تمرين:
  1. أنشئ مصفوفة ترابطية تمثل منتجاً مع: الاسم، السعر، الفئة، المخزون، والتقييمات
  2. أضف حقلاً جديداً "الخصم" واحسب السعر النهائي
  3. أنشئ مصفوفة من 3 منتجات ورتبها حسب السعر
  4. اكتب دالة تبحث عن المنتجات حسب الفئة
  5. أنشئ مصفوفة متداخلة تمثل سلة تسوق بمنتجات متعددة واحسب الإجمالي

أفضل الممارسات

  • استخدم أسماء مفاتيح وصفية ذات معنى
  • حافظ على تسمية المفاتيح متسقة (snake_case أو camelCase)
  • تحقق دائماً من وجود المفاتيح قبل الوصول إليها
  • استخدم array_key_exists() للتحقق من المفاتيح ذات القيم الفارغة
  • استخدم isset() لفحوصات الوجود العامة
  • وثق هياكل المصفوفات المتداخلة المعقدة
  • استخدم معامل الاندماج الفارغ ?? للقيم الافتراضية

حالات الاستخدام الشائعة

  • ملفات التكوين: تخزين إعدادات التطبيق
  • نتائج قواعد البيانات: تمثيل الصفوف بأسماء الأعمدة كمفاتيح
  • استجابات API: معالجة بيانات JSON المحولة إلى مصفوفات
  • معالجة النماذج: معالجة بيانات $_POST و $_GET
  • تخزين الجلسة: تخزين بيانات خاصة بالمستخدم في $_SESSION
  • ملفات الترجمة: ربط مفاتيح اللغة بالنصوص المترجمة
تحذير:
  • المفاتيح حساسة لحالة الأحرف: "Name" و "name" مفتاحان مختلفان
  • يجب أن تكون المفاتيح نصوص أو أعداد صحيحة (وليس أعداد عشرية أو منطقية)
  • استخدام مفاتيح متغيرة يتطلب أقواس معقوفة: $arr["{$key}"]
  • كن حذراً مع تحويل الأنواع - مفاتيح النصوص الرقمية تتصرف بشكل مختلف

الملخص

في هذا الدرس، تعلمت:

  • كيفية إنشاء واستخدام المصفوفات الترابطية بمفاتيح مسماة
  • كيفية الوصول إلى أزواج المفتاح-القيمة وتعديلها وإضافتها
  • كيفية التكرار عبر المصفوفات الترابطية
  • الدوال المفيدة للعمل مع المفاتيح والقيم
  • كيفية العمل مع المصفوفات الترابطية المتداخلة
  • كيفية دمج وترتيب المصفوفات الترابطية
  • أمثلة عملية على معالجة النماذج وإدارة التكوين

المصفوفات الترابطية ضرورية لتنظيم وإدارة البيانات المهيكلة في PHP. يتم استخدامها على نطاق واسع في تطوير الويب لمعالجة النماذج ونتائج قواعد البيانات وبيانات API والمزيد!

ES
Edrees Salih
منذ 21 ساعة

We are still cooking the magic in the way!