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

الحلقات في PHP: for و while و foreach

الدرس 4 من 12 · PHP

تخيّل أنك تريد عرض 100 منتج في صفحة متجرك. هل ستكتب echo مئة مرة؟ بالطبع لا. الحلقات (Loops) تجعل البرنامج يكرر نفس الأوامر عدداً من المرات وأنت تكتبها مرة واحدة. وفي PHP بالذات، الحلقات هي الطريقة التي تُبنى بها القوائم والجداول في صفحات المواقع من البيانات.

نستخدمها عندما نعرف عدد مرات التكرار مسبقاً:

<?php
for ($i = 1; $i <= 5; $i++) {
echo "الدورة رقم $i\n";
}
الناتج
الدورة رقم 1
الدورة رقم 2
الدورة رقم 3
الدورة رقم 4
الدورة رقم 5

بين القوسين ثلاثة أجزاء مفصولة بفاصلة منقوطة:

  1. البداية $i = 1: يُنفَّذ مرة واحدة قبل أول دورة.
  2. الشرط $i <= 5: يُفحص قبل كل دورة؛ إذا صار خطأ تتوقف الحلقة.
  3. الخطوة $i++: تُنفَّذ بعد كل دورة، و $i++ تعني «زد واحداً».

تخيّلها مثل العدّاد في صالة الرياضة: تبدأ من 1، وتستمر ما دمت لم تصل إلى 5، وتزيد العدّ بعد كل تمرين.

ويمكن أن تكون الخطوة أي قيمة، حتى تنازلية:

<?php
for ($i = 10; $i >= 0; $i -= 5) {
echo $i . "\n";
}
الناتج
10
5
0

نستخدمها عندما لا نعرف عدد المرات، بل نعرف الشرط الذي يجب أن نستمر ما دام صحيحاً:

<?php
$balance = 100;
$day = 0;
while ($balance > 0) {
$balance -= 30;
$day++;
}
echo "انتهى الرصيد بعد $day أيام";
الناتج
انتهى الرصيد بعد 4 أيام

الحلقة تسأل قبل كل دورة: «هل ما زال في الرصيد شيء؟». بعد 4 أيام يصبح الرصيد سالباً، فتتوقف.

مثل while، لكنها تفحص الشرط بعد الدورة، فتُنفَّذ مرة واحدة على الأقل حتى لو كان الشرط خطأ من البداية:

<?php
$n = 10;
do {
echo "يُنفذ مرة واحدة على الأقل: $n";
$n++;
} while ($n < 5);
الناتج
يُنفذ مرة واحدة على الأقل: 10

استخدامها نادر، لكنها مفيدة عندما تريد تنفيذ شيء ثم تقرر هل تكرره، مثل إعادة طلب إدخال حتى يكون صحيحاً.

هذه أكثر حلقة ستستخدمها في PHP. تمر على عناصر المصفوفة واحداً واحداً، دون عدّاد ولا شرط:

<?php
$fruits = ["تفاح", "موز", "برتقال"];
foreach ($fruits as $fruit) {
echo "- $fruit\n";
}
الناتج
- تفاح
- موز
- برتقال

اقرأها: «لكل عنصر في $fruits، ضعه في $fruit ونفّذ الكود». ستتعلم المصفوفات بالتفصيل في درس قادم، ومعها صيغة foreach التي تعطيك المفتاح والقيمة معاً.

  • break: أوقف الحلقة كلها فوراً واخرج منها.
  • continue: تخطَّ باقي الدورة الحالية وانتقل للدورة التالية.
<?php
for ($i = 1; $i <= 10; $i++) {
if ($i % 2 == 0) {
continue; // تخطَّ الأرقام الزوجية
}
if ($i > 7) {
break; // توقف بعد 7
}
echo $i . " ";
}
الناتج
1 3 5 7

العامل % يعطي باقي القسمة، فإذا كان باقي قسمة الرقم على 2 صفراً فالرقم زوجي.

هنا تظهر قوة PHP الحقيقية: الحلقة تولّد HTML تلقائياً:

<?php
echo "<ul>\n";
for ($i = 1; $i <= 3; $i++) {
echo " <li>الدرس $i</li>\n";
}
echo "</ul>\n";
الناتج
<ul>
<li>الدرس 1</li>
<li>الدرس 2</li>
<li>الدرس 3</li>
</ul>

تخيّل الآن أن الأرقام تأتي من قاعدة بيانات فيها مئات الدروس: نفس الحلقة ستبني القائمة كلها. وهذا ما ستفعله في آخر درس من الكورس.

اكتب حلقة تطبع جدول ضرب الرقم 7 من 1 إلى 5:

<?php
$num = 7;
for ($i = 1; $i <= 5; $i++) {
echo "$num × $i = " . ($num * $i) . "\n";
}
الناتج المتوقع
7 × 1 = 7
7 × 2 = 14
7 × 3 = 21
7 × 4 = 28
7 × 5 = 35

تحدٍّ: اكتب حلقة تحسب مجموع الأرقام من 1 إلى 100 في متغير $sum، ثم اطبعه. الناتج الصحيح: 5050.

  • الحلقة اللانهائية: تأكد أن الشرط سيصبح خطأ في لحظة ما.
  • الخطأ بواحد (Off-by-one): $i < 5 تتوقف عند 4، و $i <= 5 تصل إلى 5. فكّر جيداً في آخر قيمة تريدها.
  • الفاصلة بدل الفاصلة المنقوطة في for: الأجزاء الثلاثة يفصلها ; وليس ,.

سؤال

كم مرة تُنفَّذ الحلقة for ($i = 0; $i < 3; $i++)؟

سؤال

أي حلقة هي الأنسب للمرور على كل عناصر مصفوفة؟

  • for عندما تعرف عدد المرات، وفيها بداية وشرط وخطوة.
  • while تكرر ما دام الشرط صحيحاً، و do while تُنفَّذ مرة على الأقل.
  • foreach للمرور على عناصر المصفوفة، وهي الأشهر في PHP.
  • break توقف الحلقة، و continue تتخطى الدورة الحالية.
  • الحلقات تولّد HTML من البيانات، وهذا قلب برمجة المواقع بـ PHP.