تخطَّ إلى المحتوى

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

الدرس 6 من 12 · PHP

في المتغيرات العادية تخزّن قيمة واحدة. لكن ماذا لو أردت تخزين أسماء 30 طالباً، أو كل منتجات سلة المشتريات؟ هنا تحتاج المصفوفات (Arrays). وفي PHP بالذات، المصفوفات هي أهم بنية بيانات على الإطلاق: بيانات النماذج تصلك كمصفوفة، ونتائج قاعدة البيانات تصلك كمصفوفة. لذلك أتقن هذا الدرس جيداً.

مجموعة قيم مرتبة، وكل قيمة لها رقم (Index) يبدأ من صفر:

<?php
$colors = ["أحمر", "أخضر", "أزرق"];
echo $colors[0] . "\n";
echo $colors[2] . "\n";
echo count($colors) . "\n";
الناتج
أحمر
أزرق
3

تخيّلها مثل صف من الخزائن في المدرسة: كل خزانة لها رقم، وأول خزانة رقمها صفر. و count تخبرك بعدد الخزائن.

<?php
$colors[] = "أصفر"; // أضف في النهاية
array_push($colors, "أسود"); // طريقة أخرى للإضافة
$colors[1] = "بنفسجي"; // عدّل العنصر رقم 1
print_r($colors);
الناتج
Array
(
[0] => أحمر
[1] => بنفسجي
[2] => أزرق
[3] => أصفر
[4] => أسود
)

print_r تعرض المصفوفة كاملة بشكل مقروء، وهي ممتازة لفحص محتوى المصفوفات أثناء التجربة.

بدلاً من الأرقام، يمكنك أن تعطي كل قيمة اسماً (مفتاحاً - Key). هذه تسمى المصفوفة الترابطية (Associative Array)، وهي مثل بطاقة شخصية فيها حقول لها أسماء:

<?php
$student = [
"name" => "سارة",
"age" => 14,
"city" => "الإسكندرية",
];
echo $student["name"] . " من " . $student["city"] . "\n";
$student["grade"] = "الثاني الإعدادي"; // إضافة مفتاح جديد
echo count($student);
الناتج
سارة من الإسكندرية
4
  • الرمز => يربط المفتاح بقيمته.
  • الفاصلة بعد آخر عنصر مسموحة في PHP، وتسهّل إضافة عناصر جديدة لاحقاً.
  • إذا كتبت مفتاحاً غير موجود ستُنشئه، وإذا كان موجوداً ستعدّل قيمته.

تعرفت على foreach في درس الحلقات. ومع المصفوفة الترابطية تستطيع أخذ المفتاح والقيمة معاً:

<?php
foreach ($student as $key => $value) {
echo "$key: $value\n";
}
الناتج
name: سارة
age: 14
city: الإسكندرية
grade: الثاني الإعدادي
<?php
$nums = [5, 3, 9, 1];
sort($nums); // ترتيب تصاعدي
echo implode(", ", $nums) . "\n";
rsort($nums); // ترتيب تنازلي
echo implode(", ", $nums) . "\n";
var_dump(in_array(9, $nums)); // هل القيمة موجودة؟
echo array_sum($nums) . "\n"; // المجموع
الناتج
1, 3, 5, 9
9, 5, 3, 1
bool(true)
18
  • implode(", ", $arr): تجمع العناصر في نص واحد بينها فاصل.
  • explode(",", $text): العكس تماماً، تقطع النص إلى مصفوفة:
<?php
$tags = explode(",", "php,html,css");
print_r($tags);
الناتج
Array
(
[0] => php
[1] => html
[2] => css
)

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

<?php
$students = [
["name" => "أحمد", "score" => 85],
["name" => "منى", "score" => 92],
["name" => "عمر", "score" => 78],
];
foreach ($students as $s) {
echo $s["name"] . ": " . $s["score"] . "\n";
}
echo $students[1]["name"];
الناتج
أحمد: 85
منى: 92
عمر: 78
منى

لاحظ $students[1]["name"]: الرقم الأول يختار الطالب الثاني، والمفتاح يختار اسمه. ويمكنك استخراج عمود كامل بـ array_column:

<?php
$scores = array_column($students, "score");
echo "المتوسط: " . round(array_sum($scores) / count($scores), 1);
الناتج
المتوسط: 85

هذه سلة مشتريات: المفتاح اسم المنتج، والقيمة سعره. اطبع كل منتج بسعره، ثم احسب الإجمالي:

<?php
$cart = ["قلم" => 5, "كراسة" => 15, "مسطرة" => 7];
$total = 0;
foreach ($cart as $item => $price) {
echo "$item: $price جنيه\n";
$total += $price;
}
echo "الإجمالي: $total جنيه\n";
الناتج المتوقع
قلم: 5 جنيه
كراسة: 15 جنيه
مسطرة: 7 جنيه
الإجمالي: 27 جنيه

تحدٍّ: أضف منتجاً جديداً للسلة، وحاول حساب الإجمالي بدالة واحدة بدل الحلقة (تلميح: array_sum).

  • نسيان أن العد يبدأ من صفر: أول عنصر $arr[0] وليس $arr[1]، وآخر عنصر رقمه count($arr) - 1.
  • قراءة مفتاح غير موجود: يعطي تحذيراً Undefined array key. افحص أولاً بـ isset($arr["key"]) أو استخدم $arr["key"] ?? "قيمة افتراضية".
  • طباعة المصفوفة بـ echo: echo $colors; تطبع كلمة Array فقط مع تحذير. استخدم print_r أو implode أو حلقة.

سؤال

إذا كان $a = ['x', 'y', 'z']; فما قيمة $a[1]؟

سؤال

أي دالة تحوّل المصفوفة إلى نص واحد بين عناصره فاصل؟

  • المصفوفة المرقمة تبدأ من الصفر، والترابطية تستخدم مفاتيح بأسماء مع =>.
  • $arr[] = ... للإضافة، و count للعدد، و print_r للفحص.
  • foreach ($arr as $key => $value) تمر على المفاتيح والقيم معاً.
  • sort و in_array و array_sum و implode و explode من أهم الدوال.
  • المصفوفات المتداخلة هي شكل بيانات قاعدة البيانات: قائمة صفوف، وكل صف مصفوفة ترابطية.