We are still cooking the magic in the way!
أساسيات PHP
الحلقات التكرارية في PHP
الحلقات التكرارية في PHP
تسمح لك الحلقات التكرارية بتنفيذ كتلة من الكود بشكل متكرر، وهو أمر أساسي لمعالجة مجموعات البيانات، وأتمتة المهام المتكررة، وبناء تطبيقات ديناميكية.
حلقة while
تنفذ حلقة while كتلة من الكود طالما أن الشرط المحدد صحيح:
<?php
$counter = 1;
while ($counter <= 5) {
echo "العد: $counter<br>";
$counter++;
}
// الناتج:
// العد: 1
// العد: 2
// العد: 3
// العد: 4
// العد: 5
?>
تحذير: تأكد دائماً من أن شرط الحلقة سيصبح خاطئاً في النهاية. نسيان زيادة أو تعديل العداد سينشئ حلقة لا نهائية يمكن أن تعطل تطبيقك.
حلقة do...while
تنفذ حلقة do...while كتلة الكود مرة واحدة على الأقل قبل التحقق من الشرط:
<?php
$counter = 1;
do {
echo "العد: $counter<br>";
$counter++;
} while ($counter <= 5);
// حتى لو كان الشرط خاطئاً في البداية، يتم تشغيل الكود مرة واحدة:
$x = 10;
do {
echo "هذا يعمل مرة واحدة حتى لو لم يكن x < 10";
} while ($x < 10);
?>
ملاحظة: استخدم
do...while عندما تحتاج إلى تنفيذ الكود مرة واحدة على الأقل قبل التحقق من الشرط، مثل التحقق من إدخال المستخدم.
حلقة for
حلقة for مثالية عندما تعرف عدد مرات التكرار التي تريدها:
<?php
// بناء الجملة: for (التهيئة; الشرط; الزيادة)
for ($i = 1; $i <= 5; $i++) {
echo "التكرار: $i<br>";
}
// تهيئات وزيادات متعددة:
for ($i = 0, $j = 10; $i < 5; $i++, $j--) {
echo "i: $i, j: $j<br>";
}
// حلقة تنازلية:
for ($i = 10; $i > 0; $i--) {
echo "العد التنازلي: $i<br>";
}
?>
حلقة foreach
حلقة foreach مصممة خصيصاً للتكرار عبر المصفوفات وهي الحلقة الأكثر استخداماً في PHP:
<?php
// تكرار مصفوفة بسيطة:
$fruits = ["تفاح", "موز", "كرز"];
foreach ($fruits as $fruit) {
echo "$fruit<br>";
}
// مصفوفة ترابطية مع مفاتيح وقيم:
$person = [
"name" => "أحمد",
"age" => 30,
"city" => "القاهرة"
];
foreach ($person as $key => $value) {
echo "$key: $value<br>";
}
?>
نصيحة: استخدم دائماً
foreach عند العمل مع المصفوفات. إنها أنظف وأكثر أماناً وأسهل في القراءة من استخدام حلقات for التقليدية مع فهارس المصفوفة.
تعديل عناصر المصفوفة في foreach
يمكنك تعديل عناصر المصفوفة باستخدام مرجع (&) في حلقة foreach:
<?php
$numbers = [1, 2, 3, 4, 5];
// استخدام المرجع لتعديل المصفوفة الأصلية:
foreach ($numbers as &$number) {
$number = $number * 2;
}
unset($number); // قم دائماً بإلغاء المرجع بعد الحلقة
print_r($numbers); // [2, 4, 6, 8, 10]
?>
تحذير: قم دائماً بـ
unset() متغير المرجع بعد حلقة foreach. يبقى المرجع نشطاً ويمكن أن يسبب سلوكاً غير متوقع في الكود اللاحق.
عبارات التحكم في الحلقة
عبارة break
عبارة break تخرج من الحلقة على الفور:
<?php
// الخروج من الحلقة عند تحقق الشرط:
for ($i = 1; $i <= 10; $i++) {
if ($i == 5) {
break; // الخروج من الحلقة
}
echo "$i ";
}
// الناتج: 1 2 3 4
// الخروج من الحلقات المتداخلة مع المستوى:
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
if ($j == 2) {
break 2; // الخروج من كلا الحلقتين
}
echo "($i, $j) ";
}
}
?>
عبارة continue
عبارة continue تتخطى التكرار الحالي وتنتقل إلى التالي:
<?php
// تخطي الأرقام الزوجية:
for ($i = 1; $i <= 10; $i++) {
if ($i % 2 == 0) {
continue; // الانتقال إلى التكرار التالي
}
echo "$i ";
}
// الناتج: 1 3 5 7 9
// تخطي قيم محددة في foreach:
$fruits = ["تفاح", "موز", "كرز", "تمر"];
foreach ($fruits as $fruit) {
if ($fruit == "موز") {
continue; // تخطي الموز
}
echo "$fruit ";
}
// الناتج: تفاح كرز تمر
?>
الحلقات المتداخلة
يمكن تداخل الحلقات داخل حلقات أخرى للعمل مع بيانات متعددة الأبعاد:
<?php
// جدول الضرب:
for ($i = 1; $i <= 5; $i++) {
for ($j = 1; $j <= 5; $j++) {
$result = $i * $j;
echo "$result\t";
}
echo "<br>";
}
// foreach متداخلة لمصفوفة ثنائية الأبعاد:
$students = [
["name" => "أحمد", "grade" => 85],
["name" => "فاطمة", "grade" => 92],
["name" => "محمد", "grade" => 78]
];
foreach ($students as $student) {
foreach ($student as $key => $value) {
echo "$key: $value ";
}
echo "<br>";
}
?>
ملاحظة: كن حذراً مع الحلقات المتداخلة لأنها يمكن أن تؤثر بشكل كبير على الأداء. حلقة داخل حلقة تعمل كل منهما 1000 مرة تنتج 1,000,000 تكرار.
بناء جملة بديل للحلقات
توفر PHP بناء جملة بديل للحلقات مفيد في القوالب:
<?php
// بناء الجملة التقليدي:
for ($i = 1; $i <= 5; $i++) {
echo "<li>العنصر $i</li>";
}
// بناء الجملة البديل (أفضل لخلط HTML):
for ($i = 1; $i <= 5; $i++):
echo "<li>العنصر $i</li>";
endfor;
// بناء جملة foreach البديل:
foreach ($fruits as $fruit):
echo "<li>$fruit</li>";
endforeach;
// بناء جملة while البديل:
while ($condition):
// كود
endwhile;
?>
أمثلة عملية
إنشاء قوائم HTML
<?php
$tasks = ["شراء البقالة", "تنظيف المنزل", "إنهاء المشروع"];
echo "<ul>";
foreach ($tasks as $index => $task) {
$number = $index + 1;
echo "<li>المهمة $number: $task</li>";
}
echo "</ul>";
?>
معالجة بيانات النموذج
<?php
// افترض أن $_POST يحتوي على مربعات اختيار متعددة:
$selectedItems = $_POST['items'] ?? [];
foreach ($selectedItems as $item) {
echo "معالجة: $item<br>";
}
// التحقق من مدخلات متعددة:
$errors = [];
$fields = ['name', 'email', 'phone'];
foreach ($fields as $field) {
if (empty($_POST[$field])) {
$errors[] = ucfirst($field) . " مطلوب";
}
}
?>
بناء نظام ترقيم الصفحات
<?php
$totalPages = 10;
$currentPage = 5;
echo "<div class='pagination'>";
for ($i = 1; $i <= $totalPages; $i++) {
if ($i == $currentPage) {
echo "<span class='active'>$i</span> ";
} else {
echo "<a href='?page=$i'>$i</a> ";
}
}
echo "</div>";
?>
نصائح أداء الحلقة
<?php
// سيء: حساب العدد في كل تكرار:
for ($i = 0; $i < count($array); $i++) {
// كود
}
// جيد: احسب العدد مرة واحدة:
$count = count($array);
for ($i = 0; $i < $count; $i++) {
// كود
}
// الأفضل: استخدم foreach للمصفوفات:
foreach ($array as $item) {
// كود
}
// تجنب استعلامات قاعدة البيانات المتداخلة:
// سيء:
foreach ($users as $user) {
$orders = getOrdersForUser($user['id']); // استعلام في الحلقة!
}
// جيد:
$allOrders = getAllOrdersWithUsers(); // استعلام واحد
?>
نصيحة: عند العمل مع قواعد البيانات، حاول جلب جميع البيانات المطلوبة في استعلام واحد بدلاً من الاستعلام داخل حلقة. هذا يحسن الأداء بشكل كبير.
الحلقات اللانهائية واستخداماتها
<?php
// حلقة لا نهائية مقصودة (مفيدة للخدمات/العمليات الخلفية):
while (true) {
// معالجة المهام
$task = getNextTask();
if ($task === null) {
break; // الخروج عندما لا توجد مهام أخرى
}
processTask($task);
sleep(1); // منع تحميل وحدة المعالجة المركزية
}
// حلقة لا نهائية بديلة:
for (;;) {
// تستمر إلى الأبد ما لم يتم استدعاء break
}
?>
تمرين تطبيقي
المهمة: إنشاء محاكي لعبة تخمين الأرقام:
- حدد رقماً سرياً بين 1 و 100
- استخدم حلقة لمحاكاة التخمينات من 1 إلى 100
- لكل تخمين، اعرض "منخفض جداً" أو "مرتفع جداً"
- عند العثور عليه، اعرض "تم العثور عليه في X محاولة" واخرج
- إضافة: نفذ خوارزمية البحث الثنائي بدلاً من التخمين المتسلسل
- إضافي: أنشئ مصفوفة من 20 منتجاً واستخدم foreach لعرضها في جدول HTML بألوان صفوف متبادلة
أفضل الممارسات
- استخدم
foreachللمصفوفات كلما أمكن - إنها أنظف وأكثر أماناً - تأكد دائماً من أن الحلقات لها شرط خروج لمنع الحلقات اللانهائية
- ألغِ متغيرات المرجع بعد حلقات foreach مع المراجع
- تجنب إجراء عمليات مكلفة (استعلامات قاعدة البيانات، عمليات الملفات) داخل الحلقات
- استخدم
breakللخروج مبكراً عندما تجد ما تبحث عنه - استخدم
continueلتخطي المعالجة غير الضرورية - خزن أعداد المصفوفات ونتائج الدوال خارج الحلقات
- فكر في استخدام دوال المصفوفة (array_map, array_filter) كبدائل للحلقات