for في PHP
(PHP 4, PHP 5, PHP 7)
تعدّ حلقات for
النوع الأكثر تعقيدًا من الحلقات في PHP، وهي مشابهة لنظيرتها في لغة C، وتأخذ الصيغة التالية:
for (expr1; expr2; expr3)
statement
ينفّذ التعبير expr1
مرة واحدة دون قيد أو شرط في بداية الحلقة، وينفّذ التعبير expr2
في بداية كل دورة، فإن كانت النتيجة هي TRUE
فتستمر الحلقة في عملها وتنفّذ العبارات المضمّنة فيها، أما إن كانت النتيجة هي FALSE
فتتوقف الحلقة عن العمل، أما التعبير expr3
فينفّذ في نهاية كل دورة.
يمكن ترك أي تعبير من التعابير الثلاثة فارغًا، كما يمكن استخدام عدد من التعابير مفصولة بفواصل، وتنفّذ جميع التعابير التي يتضمنها التعبير expr2
لكن النتيجة تؤخذ من العبارة الأخيرة فقط. يؤدي ترك التعبير expr2
فارغًا إلى تنفيذ الحلقة إلا ما لا نهاية (تعتبر PHP ضمنيًّا أن القيمة هي TRUE
، كما في C). قد لا يكون هذا دون فائدة كما تظن، إذ قد ترغب أحيانًا في إيقاف الحلقة باستخدام عبارة break شرطية بدلًا من استخدام عملية التحقق التي تجريها الحلقة.
لاحظ الأمثلة التالية، والتي تعرض الأرقام من 1 إلى 10:
<?php
/* المثال 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* المثال 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* المثال 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* المثال 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
من المؤكد أن المثال الأول هو المثال الأجمل (أو ربما يكون المثال الرابع) ولكن ستجد في كثير من الأحيان أن ترك التعابير فارغة في حلقة for أمر لا يخلو من الفائدة.
تدعم PHP أيضًا الصيغة البديلة لحلقات for
:
for (expr1; expr2; expr3):
statement
...
endfor;
من الشائع جدًّا استخدام حلقات for
للمرور على عناصر المصفوفة كما يوضّح المثال التالي:
<?php
/*
* تتضمن هذه المصفوفة بعض البيانات التي نرغب في تعديلها
* عند المرور بالحلقة التكرارية.
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
قد تكون الشيفرة السابقة بطيئة لأنّها تحسب عدد عناصر المصفوفة في كل دورة، ولما كان عدد العناصر ثابتًا يمكن تحسين الحلقة التكرارية باستخدام متغير وسيط نخزّن فيه عدد العناصر بدلًا من استدعاء الدالة ()count
في كل دورة:
<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>