في هذا الدرس 6تصفّح المواضيع
صُممت حلقة foreach في لغة PHP خصيصاً للمرور على عناصر المصفوفات بأمان وسلاسة:
- تعمل مع كافة أنواع المفاتيح: على عكس حلقة
forالرقمية (التي تتعطل إذا كانت المفاتيح نصية أو كانت هناك فجوات في الأرقام بعدunset())، تتبع حلقةforeachالمؤشر الداخلي للمصفوفة مباشرة. - بدون عدادات يدوية: لا تحتاج إلى تعريف عداد
$i = 0أو استدعاءcount().
<?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
$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
$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;دون استخدام مراجع.
<?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
$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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم لماذا صُممت foreach للمصفوفات للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم المرور على قيم المصفوفة مباشرة وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
لماذا تُفضل حلقة foreach على حلقة for الرقمية عند المرور على المصفوفات الترابطية أو المصفوفات ذات الفهارس غير المتصلة؟
لأن حلقة foreach تمر تلقائياً على جميع عناصر المصفوفة سواء كانت مفاتيحها نصية أو تحتوي على فجوات رقمية.
إذا قمت بتعديل قيمة المتغير $val داخل حلقة foreach ($items as $val) عادية (بدون علامة &)، فماذا يحدث للمصفوفة الأصلية $items؟
لا تتأثر المصفوفة الأصلية إطلاقاً؛ لأن حلقة foreach العادية تنسخ القيمة في المتغير المؤقت.
أي صياغة من صيغ حلقة foreach تستخرج كلاً من المفتاح والقيمة في كل دورة؟
تُستخدم الصياغة foreach ($array as $key => $value).
كيف تعدل عناصر المصفوفة $prices مباشرة في موضعها عبر متغير حلقة foreach؟
بوضع علامة المرجع & قبل متغير القيمة في رأس الحلقة: foreach ($prices as &$price).
بعد انتهاء حلقة foreach ($items as &$item) بالمرجع، يجب استدعاء unset($item); مباشرة لفك ارتباط المتغير بالعنصر الأخير في المصفوفة.
صواب؛ يفك استدعاء unset($item) ارتباط المرجع المعلق ويحمي العنصر الأخير من التعديل غير المقصود لاحقاً.
استدعاء unset($item) بعد انتهاء حلقة foreach ($items as &$item) يؤدي إلى حذف العنصر الأخير من المصفوفة $items.
خطأ؛ يقوم unset($item) بفك ارتباط المتغير المؤقت $item فقط، بينما يبقى العنصر الأخير داخل المصفوفة $items محفوظاً وسليماً.
ما الأمر الذي يُستخدم داخل حلقة foreach لتخطي الدورة الحالية والانتقال فوراً إلى العنصر التالي في المصفوفة؟
يقوم الأمر continue بتخطي بقية الكود في الدورة الحالية والانتقال للعنصر التالي.
بأي طريقتين مما يلي يمكنك تعديل عنصر داخل المصفوفة الأصلية $list بأمان أثناء الدوران بحلقة foreach؟
إما عبر التمرير بالمرجع &$v متبوعاً بـ unset($v) بعد الحلقة، أو عبر التعديل بالمفتاح مباشرة $list[$k] = $newVal.