انتقل إلى محتوى الدرس
الدرس 29
دورة PHP

تكرار عناصر المصفوفات عبر حلقة foreach في PHPPHP Foreach Loop

تعلّم تكرار عناصر المصفوفات عبر حلقة foreach في PHP بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
1
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

صُممت حلقة foreach في لغة PHP خصيصاً للمرور على عناصر المصفوفات بأمان وسلاسة:

  • تعمل مع كافة أنواع المفاتيح: على عكس حلقة for الرقمية (التي تتعطل إذا كانت المفاتيح نصية أو كانت هناك فجوات في الأرقام بعد unset())، تتبع حلقة foreach المؤشر الداخلي للمصفوفة مباشرة.
  • بدون عدادات يدوية: لا تحتاج إلى تعريف عداد $i = 0 أو استدعاء count().
مخطط يوضح صيغ حلقة foreach في PHP 8.4 لقراءة القيم والمفاتيح والتعديل بالمرجع مع تحرير المتغير
PHP
<?php
// Even with non-sequential keys, foreach works cleanly:
$sparse = [0 => "First", 5 => "Second", 12 => "Third"];

foreach ($sparse as $item) {
    echo $item . " ";
}

عندما تحتاج إلى قراءة قيم العناصر فقط دون مفاتيحها، نستخدم الصياغة المختصرة foreach ($array as $value):

  • النسخ بالقيمة افتراضياً: في كل دورة، يسند محرك PHP قيمة العنصر الحالي إلى المتغير $value ثم ينتقل للعنصر التالي.
  • ثبات المصفوفة الأصلية: تعديل المتغير المؤقت $value داخل الحلقة العادية لا يغير القيم المحفوظة داخل المصفوفة الأصلية.
PHP
<?php
$totals = [45.5, 104.5, 50.0];
$grandTotal = 0.0;

foreach ($totals as $amount) {
    $grandTotal += $amount;
}
echo "Grand Total: " . $grandTotal;

عند الدوران على مصفوفة ترابطية (أو عند الحاجة لمعرفة رقم الفهرس في مصفوفة مفهرسة)، نستخرج المفتاح والقيمة معاً عبر الصياغة foreach ($array as $key => $value):

  • اختيار أسماء متغيرات معبرة: يُفضل تسمية المتغيرات بوضوح مثل foreach ($prices as $product => $price).
  • دعم أوامر التحكم: يمكنك استخدام continue لتخطي دورة معينة أو break لإيقاف الحلقة مبكراً عند تحقق شرطك.
PHP
<?php
$quotas = [
    "basic"      => 10,
    "pro"        => 100,
    "enterprise" => 1000,
];
foreach ($quotas as $plan => $gb) {
    echo $plan . "=" . $gb . "GB ";
}

لتعديل عناصر المصفوفة الأصلية مباشرة أثناء الدوران عليها بحلقة foreach، نضع علامة المرجع (&) قبل متغير القيمة: foreach ($items as &$item):

  • تعديل مباشر في المصفوفة الأصلية: أي تغيير يطرأ على المتغير $item يُطبق فوراً على العنصر المقابل داخل المصفوفة.
  • البديل الآمن بالمفتاح: يمكنك أيضاً التعديل عبر المفتاح بكتابة $items[$key] = $newValue; دون استخدام مراجع.
مخطط تدفق التنفيذ العملي لقسم تعديل العناصر بالمرجع في foreach في لغة PHP
PHP
<?php
$codes = ["  ab-10 ", " cd-20  "];

foreach ($codes as &$code) {
    $code = strtoupper(trim($code));
}
unset($code);

echo $codes[0] . " | " . $codes[1];

قاعدة أمان حرجة في PHP: عند استخدام المرجع &$value في حلقة foreach، يجب دائماً استدعاء unset($value); فور انتهاء قوس الحلقة }:

  • فخ المرجع المعلق (Dangling Reference): يظل متغير الحلقة موجوداً في النطاق بعد انتهاء الحلقة، ويبقى مرتبطاً بالعنصر الأخير في المصفوفة؛ فإذا استخدمت نفس اسم المتغير لاحقاً ستقوم بتخريب العنصر الأخير دون قصد!
  • فك الارتباط عبر unset($val): استدعاء unset($val); يفك ارتباط المتغير المؤقت فقط مع بقاء المصفوفة وعنصرها الأخير سليمين تماماً.
PHP
<?php
$nums = [10, 20, 30];
foreach ($nums as &$n) {
    $n *= 2;
}
unset($n); // Breaks reference to $nums[2]

$n = 999;  // Safe! Does NOT overwrite $nums[2]
echo $nums[0] . ", " . $nums[1] . ", " . $nums[2];

يقارن الجدول المرجعي التالي بين أنماط حلقة foreach وحلقة for في لغة PHP 8.4:

نمط الحلقةالصياغة البرمجيةالحالة المثلى للاستخدام
قراءة القيم فقطforeach ($arr as $v)المرور السريع النظيف على قيم أي مصفوفة
المفتاح والقيمةforeach ($arr as $k => $v)المصفوفات الترابطية أو عند الحاجة لرقم الفهرس
التعديل بالمرجعforeach ($arr as &$v) مع unset($v);تعديل عناصر المصفوفة الأصلية في موضعها
حلقة for الرقميةfor ($i = 0; $i < $n; $i++)العد العكسي أو القفز بخطوات مخصصة أو النطاقات الرقمية
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس المرور على عناصر المصفوفات عبر foreach ($arr as $val)، واستخراج المفتاح والقيمة عبر foreach ($arr as $key => $val)، وتعديل العناصر في موضعها بالمرجع &$val، وحماية الكود من فخ المرجع المعلق عبر unset($val);. الخطوة التالية: انتقل إلى الدرس الثالث والعشرين «المصفوفات متعددة الأبعاد وتفكيك المصفوفات في PHP» لتمثيل الجداول والبيانات المتداخلة.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Foreach Loop حلقة foreach
تعلّم تكرار عناصر المصفوفات عبر حلقة foreach في PHP بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
للمراجعة
02 Foreach Loop for Arrays لماذا صُممت foreach للمصفوفات
المفهوم الأساسي لقسم لماذا صُممت foreach للمصفوفات في لغة PHP الحديثة.
للمراجعة
03 Iterating Array Values Cleanly المرور على قيم المصفوفة مباشرة
الصياغة البرمجية والتطبيق العملي المباشر لقسم المرور على قيم المصفوفة مباشرة.
للمراجعة
04 Extracting Both Keys and Values استخراج المفتاح والقيمة معاً
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم استخراج المفتاح والقيمة معاً.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 PHP PHP
PHP: Hypertext Preprocessor
لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
للمراجعة
02 CLI CLI
Command-Line Interface
واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
للمراجعة
03 FPM FPM
FastCGI Process Manager
مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
للمراجعة
04 HTML HTML
HyperText Markup Language
لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم لماذا صُممت foreach للمصفوفات للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم المرور على قيم المصفوفة مباشرة وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

لماذا تُفضل حلقة foreach على حلقة for الرقمية عند المرور على المصفوفات الترابطية أو المصفوفات ذات الفهارس غير المتصلة؟

لأن حلقة foreach تمر تلقائياً على جميع عناصر المصفوفة سواء كانت مفاتيحها نصية أو تحتوي على فجوات رقمية.

02

إذا قمت بتعديل قيمة المتغير $val داخل حلقة foreach ($items as $val) عادية (بدون علامة &)، فماذا يحدث للمصفوفة الأصلية $items؟

لا تتأثر المصفوفة الأصلية إطلاقاً؛ لأن حلقة foreach العادية تنسخ القيمة في المتغير المؤقت.

03

أي صياغة من صيغ حلقة foreach تستخرج كلاً من المفتاح والقيمة في كل دورة؟

تُستخدم الصياغة foreach ($array as $key => $value).

04

كيف تعدل عناصر المصفوفة $prices مباشرة في موضعها عبر متغير حلقة foreach؟

بوضع علامة المرجع & قبل متغير القيمة في رأس الحلقة: foreach ($prices as &$price).

05

بعد انتهاء حلقة foreach ($items as &$item) بالمرجع، يجب استدعاء unset($item); مباشرة لفك ارتباط المتغير بالعنصر الأخير في المصفوفة.

صواب؛ يفك استدعاء unset($item) ارتباط المرجع المعلق ويحمي العنصر الأخير من التعديل غير المقصود لاحقاً.

06

استدعاء unset($item) بعد انتهاء حلقة foreach ($items as &$item) يؤدي إلى حذف العنصر الأخير من المصفوفة $items.

خطأ؛ يقوم unset($item) بفك ارتباط المتغير المؤقت $item فقط، بينما يبقى العنصر الأخير داخل المصفوفة $items محفوظاً وسليماً.

07

ما الأمر الذي يُستخدم داخل حلقة foreach لتخطي الدورة الحالية والانتقال فوراً إلى العنصر التالي في المصفوفة؟

يقوم الأمر continue بتخطي بقية الكود في الدورة الحالية والانتقال للعنصر التالي.

08

بأي طريقتين مما يلي يمكنك تعديل عنصر داخل المصفوفة الأصلية $list بأمان أثناء الدوران بحلقة foreach؟

إما عبر التمرير بالمرجع &$v متبوعاً بـ unset($v) بعد الحلقة، أو عبر التعديل بالمفتاح مباشرة $list[$k] = $newVal.