for في PHP

من موسوعة حسوب
< 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);
}
?>

مصادر