المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : درس[7] حلقات الدوران Loops فى الـ php


محمود عفيفى
26-03-2010, 02:54 PM
السلام عليكم ورحمة الله وبركاته
بعد ان تعرفنا على كافة اشكال المشروطات المعتادة. وكيفية جعل برامجنا قادرة على اتخاذ القرار. وتحديد اى الأكواد التى سيتم اخذها فى مختلف الحالات.

حان وقت استعراض بعض حلقات الدوران او مايعرف بإسم Loops فى الـ php

حلقات الدوران:-
هى نوعا ما مشروطات ايضا, وهى تمكنك من جعل برنامجك يكرر كود ما او مهمة ما الى الأجل الذى تحدده انت.

وسنبدأ درس اليوم بالمشروطة While
وكما يتضح من اسمها فهى تعنى, الا ان.

وتكتب بالشكل التالى
while(expression){
//do something
} طول ما حالة الـ expression هى true سيستمر ماداخل حلقة الـ while بالتكرار.

اليك مثال توضيحى مثلا. نريد ان نطبع الأرقام من 1 الى 10 مع فصل بين كل رقم بسطر جديد (<br />)

بإستخدام الطرق الثابتة سنكتبه بالشكل التالى
1<br />2<br />3<br />
الخلكن مع حلقات الدوران الأمر ابسط من هذا بكثير
مجرد 3 اسطر صغيرين.
$i = 1;
while($i <= 10){
echo $i . "<br />";
$i++;
} بالأول حددنا القيمة 1 للمتغير i

بعدها بدأنا حلقة الدوران while وقولنا لها نفذى الكود الذى بداخلك
طول ما متغير الـ i اصغر من او متساوى مع الرقم 10
شرح الكود الذى بداخلها.
اول شئ طلبنا منه ان يطبع قيمة المتغيير i ويضف اليه وسم بداية السطر الجديد وهو الـ <br />
السطر الأخر (هذا يعتبر جديد عليك) اضفنا للمتغير i العامل ++

هذا العامل يجعل من المتغيير i يساوى i+1 بكل مرة يتم استدعائه.
وبما اننا طلبنا 9 مرات (من 1 الى 10) فإنه سيستمر فى اضافة 1 الى المتغيير i
حتى يصل المتغيير i الى القيمة 10 وبعدها ستتوقف
حلقة الـ while عن العمل لأننا اشترطنا عليه ان تستمر فى العمل طول مالمتغيير i اصغر من او يساوى 10

لا اظن ان حلقة الدوران while تحتاج للشرح اكثر من هذا فهى بسيطة وواضحة كما ترى

سأشرح العامل ++ مرة اخرى وايضا العامل -- فهم الأثنين شئ واحد مع اختلاف التطبيق الحسابى (جمع وطرح).
العامل ++ يضيف 1 الى المتغير
العامل -- يطرح واحد من المتغير.
اليك مثال توضيحى
$x = 10;
$x++;
echo $x;
$x--;
echo $x; ستلاحظ ان امر الطباعة الأول طبع 11 والثانى طبع 10
شرح الكود. السطر الأول اعطينة المتغير x القيمة 10
بعدها اضفنا العامل ++ للمتغيير x فأضاف اليه 1 فأصبحت قيمة المتغير x هى 11
بعدها اضفنا العامل -- للمتغير x فتم طرح 1 من اخر قيمة له (وهى 11) فأصبحت قيمته مرة اخرى هى 10.

يمكن ايضا كتابة هذه العوامل قبل او بعد المتغير
يعنى يمكن ان يكتب العامل ++ بالأشكال التالية
$x++;
//or
++$x;الفرق بين الأثنين بسيط
واليك المثالين التاليين للتوضيح
$x = 10;
echo $x++; فى المثال السابق ستلاحظ ان امر الطباعة (echo) طبع قيمة المتغيير x الحقيقية
قبل ان يضيف اليها 1. لماذا؟ لأن العامل ++ جاء بعد المتغير وليس قبله.
بالتالى فهو ينفذ الأمر عليه (امر الطباعة فى هذا المثال)
بعدها يضيف 1 الى قيمته.
لكن اذا نظرنا للمثال التالى
$x = 10;
echo ++$x; ستلاحظ انه طبع القيمة 11, هذا لأنه بالأول اضاف 1 الى قيمة المتغير الأصلية, بعدها نفذ عليه امر الطباعة.
ونفس الشئ بالنسبة للعامل -- لا اظن انه يحتاج لأن يتم شرحه ايضا.

لنعود لموضوعنا حلقات الدوران.

بعد ان تعرفنا للمشروطة الدورانية while

يأتى شرح الـ do .. while
وتكتب بالشكل التالى
do{
//any thing
}while(expression); وهى عملها تمام مثل while
بإستثناء فرق بسيط
while لن تنفذ مابداخلها نهائيا
الا عند تحقق الشرط الذى وضعناه لها.
لكن do.. while
سوف تنفذ مابداخلها على الأقل مرة واحدة اذا لم تتحقق المشروطة.
بمعنى هل 10 اصغر من 9 ؟ بالطبع لا. ولذلك اذا شغلنا الإسكريبت التالى لن يتم تنفيذه
while( 10 < 9){
echo "ok";
} لكن مع do..while سوف عمل مابداخل الحلقة حتى ولو لم تتحقق المشروطة
do{
echo "ok";
}while(10 < 9); هذا هو الفرق بين الإثنين.

هناك ايضا الحلقة الدورانية for
وهى اكثر تعقيدا بعض الشئ عن while و do..while
لكن هذا التعقيد لن يكون الا عند النظرة الأولى فقط. لكن بعد فهمها سترى انها بسيطة.
for تأخذ ثلاث مدخلات.
الأول هو عادة يكون بداية العد (بداية عداد)
الثانى هو المشروطة التى لا يجب ان تتخطاها الدالة (الحد الأقصى)
الثالث هو التغير الذى سيتم على العداد.
كامثال توضيحى
for($i = 1; $i <= 10; $i++){
//do something
} الكود اعلاه معناه. ان المتغيير i له القيمة 1
المدخل الثانى (المشروطة) تشترط ان المتغير i لا يتعدى الرقم 10
الثالث يطلب اضافة 1 للمتغيير i.
تماما مثل اول مثال لنا بإستخدام while

الكلمة break واستخدامها فى الحلقات الدورانية.
الكلمة break تعنى قف, او كسر, وفى الحلقات الدورانية تعنى توقف عن الدوران.

كامثال على استخدام الكلمة break
هو اذا كان لدينا متغير ما يتم ادخاله بواسطة المستخدم مثلا
ونحن نريد من الحلقة الدورانية ان تنفذ كود ما بعدد الرقم الذى يدخله المستخدم. لكن نريد وضع حد اقصى لهذا التكرار (حتى لا يتسبب التكرار الكثير فى زيادة الضغط على السيرفر)

يمكننا تنفيذ هذا بإستخدام المشروطة if داخل حلقة الدوران التى سنتستخدمها ولنفترض انها while
//$var هى القيمة التى يدخلها المستخدم ونحن نجهلها
$i = 1;
while($i < $var){
echo $i."<br />";
$i++;
if($i > 10){
break;
}
} لاحظ فى الكود اعلاه. انه اذا كانت قيمة $var اكبر من 10 فلن تعمل الحلقة الدورانية while عندما تصل قيمة $i الى 10
وهذا بسبب اننا اشترطنا انه فى حالة ان قيمة المتغيير $i تعدت 10 ان يتم نداء الكلمة break والتى تتسبب فى ايقاف الحلقة عن العمل.

هناك ايضا الكلمة continue وهى تعنى استمر. لكن بحلقات الدوران تعنى تخطى هذا, او استثنى.
كامثال توضيحى بإستخدام الحلقة الدروانية for مع مشروطة if جرب التالى
for($i = 1; $i < 10; $i++){
if($i == 3){
continue;
}
echo $i ."<br />";
} سترى ان الإسكريبت طبع من 1 الى 10 بإستثناء الرقم 3
وهذا لأننا اشترطنا ان يتم تنفيذ الأمر continue عندما تكون قيمة المتغير $i هى 3

لاحظ ايضا انه يمكنك استخدام حلقة الدوران for داخل حلقة دروان for او while او العكس.
على حسب احتياجك.

شئ اخير احب ان انوه اليه.
دائما عند استخدامك لحلقات الدوران, تأكد من وجود نقطة انتهاء للدوران حتى يتوقف الإسكريبت عن تكرار المهمة, لأنه فى عدم وجود نقطة انتهاء او توقف
سوف يتسبب هذا فى تعليق الخادم الذى يعمل عليه الإسكريبت (هذا ان لن يتم ايقاف الإسكريبت بواسطة السيرفر) او رفع الضغط على الخادم.

اتمنى ان يكون الدرس كان بسيط واذا كان لديك اى استفسار لا تتردد بالسؤال وان شاء الله نكون عند حسن ظنك.

منقول

الهمام
27-03-2010, 06:50 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

أبو يوسف
27-03-2010, 08:32 PM
جزاك الله خيرا اخي محمود وبارك الله فيك

.

سالي الفلسطينية
27-03-2010, 09:25 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

محمود عفيفى
27-03-2010, 09:42 PM
حياكم الله جميعا :abc_028:

أبو فارس
30-03-2010, 03:29 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

abohmam
04-04-2010, 10:17 PM
بارك الله فيك أخى محمود

لك أجمل تحية على هذا الجهد والمتابعة المستمرة

محمود عفيفى
11-11-2010, 05:41 PM
حياكم الله جميعا
بإذن الله سنكمل الدورة إبتداءً من اليوم
:abc_152:

فلسطيني
11-11-2010, 07:35 PM
جزاك الله خيرا اخي محمود