بخش چهارم

حلقه ها و ....

در درسهای قبلی همواره کدها در یک جهت حرکت می کردند. در واقع خط به خط کدهای ما اجرا می شد و جلو می رفت. این روش جایی برای کدنویسی منعطف نمی گذارد.

در این درس می خوانیم :

چگونه یک کد را وقتی اجرا کنیم که یک عبارت True باشد. IF CLAUSE
چگونه قسمت دیگری از کد اجرا شود وقتی که همان عبارت False شود. ELSE
چگونه از دستور switch استفاده کنیم.
چگونه یک قسمت از کد را چند مربطه اجرا کنیم . while
چگونه از FOR برای اجرای حلقه استفاده کنیم.
چگونه یک حلقه FOR را قطع کنیم.


اغلب script ها نیاز به تغییر خروجی در شرایط مختلف دارند. با استفاده از IF شما می توانید خروجی کدهای خودتون را در php با توجه به یک سری شرایط تغییر دهید.

IF
IF عبارت داخل پرانتز جلوی خود را کنترل می کند و درصورتی که Trueباشد آن قسمت از کد را اجر می نماید

كد:
کد:
if ( expression ) 
{ 
// code to execute if the expression evaluates to true 
}
فرمت کلی IF به صورت بالا است. expression عبارتی است که باید کنترل شود. و عبارات بین { و } کدی است که در صورت true بودن عبارت If باید اجرا شود.

كد:
کد:
1: <html> 
2: <head> 
3: <title>Listing 5.1</title> 
4: </head> 
5: <body> 
6: <?php 
7: $mood = "happy"; 
8: if ( $mood == "happy" ) 
9: { 
10: print "Hooray, I'm in a good mood"; 
11: } 
12: ?> 
13: </body> 
14: </html>
در خط 8 کد بالا ما از == استفاده کردیم تا کنترل کنیم که mood مقدار happy را در خود دارد یا خبر.
از { و } فقط وقتی استفاده می کنیم که کدهای ما بیشتر از یک خط باشند.
کد بالا رو به صورت زیر نیز می توان نوشت :

كد:
کد:
if ( $mood == "happy" ) print "Hooray, I'm in a good mood";
در این حالت Hooray, I'm in a good mood چاپ می شود. اگر ما متغیر mood رو "sad" قرار دهیم دیگر چیزی چاپ نخواهد شد.

استفاده از ELSE در IF

فرمت کلی آن به صورت زیر است :

كد:
کد:
if ( expression ) 
{ 
// code to execute if the expression evaluates to true 
} 
else 
{ 
// code to execute in all other cases 
}
قسمت بعد از else فقط وقتی اجرا می شود که عبارت داخل if ، برابر False باشد.

كد:
کد:
1: <html> 
2: <head> 
3: <title>Listing 5.2</title> 
4: </head> 
5: <body> 
6: <?php 
7: $mood = "sad"; 
8: if ( $mood == "happy" ) 
9: { 
10: print "Hooray, I'm in a good mood"; 
11: } 
12: else 
13: { 
14: print "Not happy but $mood"; 
15: } 
16: ?> 
17: </body> 
18: </html>
در مثال بالا متغیر mood مقدار "sad" دارد و در واقع با "happy" برابر نیست پس قسمت داخل IF اجرا نمی شود و فقط قسمتی که داخل else می باشد اجرا خواهد شد. خروجی دستور بالا

به صورت

كد:
کد:
Not happy but sad
خواهد بود.

استفاده از ElseIf

ElseIf مجددا یک عبارت دیگر را اجرا می نماید و در صورت True بودن دستورات داخلش اجرا خواهد شد.

فرمت کلی به صورت زیر است :

كد:
کد:
if ( expression ) 
{ 
// code to execute if the expression evaluates to true 
} 
elseif ( another expression ) 
{ 
// code to execute if the previous expression failed 
// and this one evaluates to true 
else 
{ 
// code to execute in all other cases 
}
اگر عبارت IF درست نباشد تکه اول کد نادیده گرفته می شود و نوبت عبارت Esleif می رسد اگر این عبارت درست باشد قسمت دوم کدها اجرا می شود. دستور else در نهایت وقتی اجرا

می شود که هیچ کدام از عبارات IF و Elseif درست نباشند.
شما به هر تعداد که می خواهید می توانید esleif در کدتان بگذارید. و در نهایت Else دلخواه است و می تواند در کد وجود نداشته باشد

كد:
کد:
1: <html> 
2: <head> 
3: <title>Listing 5.3</title> 
4: </head> 
5: <body> 
6: <?php 
7: $mood = "sad"; 
8: if ( $mood == "happy" ) 
9: { 
10: print "Hooray, I'm in a good mood"; 
11: } 
12: elseif ( $mood == "sad" ) 
13: { 
14: print "Awww. Don't be down!"; 
15: } 
16: else 
17: { 
18: print "Neither happy nor sad but $mood"; 
19: } 
20: ?> 
21: </body> 
22: </html>
در مثال بالا mood مقدار sad دارد. این مقدار با Happy برابر نیست پس قسمت اول کدها نادیده گرفته می شود. Elseif متغیر mood را با مقدار sad مقایسه می کند که True است و

کدهای قسمت دوم اجرا می شوند.

دستور Switch
این دستور روش دیگری برای تغییر مسیر حرکت اجرا شدن کدهاست. دستور switch فقط یک عبارت رو چک می کند و می تواند این عبارت را با مقادیر متفاوتی مقایسه کند و فقط کدی را

اجرا کند که مقدار مورد نظر در آن True شود.
فرمت کلی به صورت زیر است :

کد:
کد:
switch ( expression ) { case result1: // execute this if expression results in result1 break; case result2: // execute this if expression results in result2 break; default: // execute this if no break statement // has been encountered hitherto }
عبارت داخل دستور switch (منظور همان expression داخل پرانتز جلوی آن است) معمولا یک متغیر است. در کد های داخل switch (منظور قسمت بین { و } می باشد) شما case های

مختلفی را می بینید که مقدار متغیر switch با همه این case ها مقایسه می شود و وقتی که مقدار ها با هم برابر بود کد مربوطه اجرا می شود.
گذاشتن قسمت default اختیاری است. در صورتی که متغیر با هیچ کدام از مقادیر caseها برابر نباشد ، دستورات داخل default اجرا خواهد شد.

احتیاط : دقت کنید که کلمه break در انتهای هر case را حتما بگذارید. در غیر اینصورت کد بعد از اجرا کردن case مورد نظر به راه خود ادامه می دهد و به مقدار default می رسد و

آن را نیز اجرا می کند و این در اکثر مواقع چیزی نیست که ما دنبالش باشیم. دستور break در واقع از کل کدهای case خارج شده و به انتهای دستور switch می رود.

مثال :

کد:
کد:
1: <html> 2: <head> 3: <title>Listing 5.4</title> 4: </head> 5: <body> 6: <?php 7: $mood = "sad"; 8: switch ( $mood ) 9: { 10: case "happy": 11: print "Hooray, I'm in a good mood"; 12: break; 13: case "sad": 14: print "Awww. Don't be down!"; 15: break; 16: default: 17: print "Neither happy nor sad but $mood"; 18: } 19: ?> 20: </body> 21: </html>
در مثال بالا ، در ابتدا mood مقدار sad را دارد و وقتی که در خط 8 Php وارد switch می شود ابتدا mood را با happy مقایسه می کند (خط 10) و به دلیل اینکه True نمی شود به خط 13

می رود در آنجا چون mood=sad است کد خط 11 و سپس خط 12 را اجرا می کند. در خط 12 با دیدن دستور break به خط 18 می رود.

روش جالب عملگر شرطی علامت سوال (؟)
من اسم این روش رو IF یک خطی گذاشتم ! در این روش شما بدون نیاز به نوشتن دستورات IF می توانید تابع شرطی ایجاد کنید که در آن عبارتی چک شود و در صورت درست بودن یک

سری کد اجرا شود و در صورت اشتباه بودن کد دیگر.

کد:
کد:
( expression )?returned_if_expression_is_true:returned_if_expression_is _false;
اگر عبارت داخل پرانتز ما True بود کد بعد از علامت سوال اجرا می شود و در غیر اینصورت کد بعد از : اجرا خواهد شد.


کد:
کد:
1: <html> 2: <head> 3: <title>Listing 5.5</title> 4: </head> 5: <body> 6: <?php 7: $mood = "sad"; 8: $text = ( $mood=="happy" )?"Hooray, I'm in a good mood":"Not happy but $mood"; 9: print "$text"; 10: ?> 11: </body> 12: </html>
در مثال بالا در خط 8 از این روش استفاده شده است. در اینجا متغیر moodبا مقدار happy مقایسه می شود اگر درست بود خواهد نوشتHooray, Im in good mood و در غیر اینصورت (که

اینجا اینطور نیست) می نویسد Not Happy But $mood که چون اینجا $mood مقدار Sad دارد خروجی می شود Not Happy But Sad.
نوشتن و خواندن کد اینطوری کمی سخت است ولی اگر شما فقط یک شرایط رو بخواهید چک کنید و علاقه به نوشتن کدهای فشرده دارید این روش بسیار خوبی است.

حلقه ها

تا به حال روشهایی را دیدید که به وسیله آن کد می تواند بین اینکه کدام کد را اجرا کند انتخاب داشته باشد. همچنین کد می تواند تصمیم بگیرد که چند دفعه یک قسمت را اجرا کند.
حلقه های برای این ایجاد شده اند که به شما اجازه دهند یک عملیات را چند مرتبه اجرا نمایید. تقریبا بدون استثناء ، همه حلقه ها آنقدر اجرا می شوند تا اینکه یک شرایطی (که از توسط

شما مشخص می شود) اتفاق بیافتد و یا اینکه شما شخصا دستور قطع و خروج از loop را بدهید.

while

کد:
کد: while ( expression ) { // do something }
تا وقتی که عبارت while (منظور همان expression داخل پرانتز جلوی آن است) True باشد کد داخل while پشت سر هم اجرا می شود. معمولا شما در داخل حلقه کاری می کنید که

عبارت مرتبا تغییر نماید و یک جا False شود در غیر اینصورت حلقه شما تا بینهایت اجرا می شود.
مثال زیر حلقه ای ایجاد می کند و مضارب 2 را نمایش می دهد.


کد:
کد:
Listing 5.6: A while Statement 1: <html> 2: <head> 3: <title>Listing 5.6</title> 4: </head> 5: <body> 6: <?php 7: $counter = 1; 8: while ( $counter <= 12 ) 9: { 10: print "$counter times 2 is ".($counter*2)."<br>"; 11: $counter++; 12: } 13: ?> 14: </body> 15: </html>
در خط 7 ما مقدار counter را 1 گذاشتیم. در خط 8 حقله ای تشکیل دادم که تا وقتی اجرا می شود که counter از 12 کوچکتر و یا مساوی آن باشد. در خط 10 خروجی برنامه را می نویسیم

و در خط 11 به counter دو عدد اضافه می کنیم. روش ++ را در درس قبلی خواندیم.
پس خروجی برنامه می شود. 2 - 4 - 8 - 10 - 12
اگر شما در خط 11 فراموش می کردید که counter را زیاد کنید این حلقه تا بینهایت اجرا می شد چون هیچگاه counter زیاد نمی شد و هیچوقت از 12 بیشتر نمی شد.

حلقه do و while

این حلقه شبیه حلقه while است فقط سر و ته شده است ! بزرگترین فرق آن این است که ابتدا کدها اجرا می شوند و بعد درستی یا نادرستی عبارت چک می شود.

کد:
کد:
do { // code to be executed } while ( expression );
توجه : آخر عبارت while در خط آخر حتما باید ; گذاشته شود.
این متد وقتی خیلی به درد می خورد که شما بخواهید کد شما حداقل یکبار اجرا شود حتی اگر شرایط عبارت while اتفاق نیافتاده باشد.

کد:
کد:
1: <html> 2: <head> 3: <title>Listing 5.7</title> 4: </head> 5: <body> 6: <?php 7: $num = 1; 8: do 9: { 10: print "Execution number: $num<br>\n"; 11: $num++; 12: } 13: while ( $num > 200 && $num < 400 ); 14: ?> 15: </body> 16: </html>
در مثال بالا حقله do....while کنترل می کند که num بزرگتر از 200 و کوچتر از 400 باشد. چون ما num رو در خط 7 مساوی یک قراردادیم پس عبارت while درست نیست و False می باشد

ولی در هر حال خروجی کد حداقل یک خط است که نوشته می شود Execution numnber : 1 .

حقله For

شما هیچ چیزی از استفاده از For به دست نمی آورید که نتوانید با While آن را ایجاد کنید. ولی در هر حال در اغلب مواقع استفاده از For کدهای زیباتر و بهتری نسبت به while ایجاد می

کند.
فرمت کلی به صورت زیر است :

کد:}
کد:
for ( variable assignment; test expression; variable increment ) { // code to be executed
هر عبارت داخل for باید حتما با ; از هم جدا شوند. معمولا ، عبارت اول یک متغیر شمارنده ایجاد می کند ، و در عبارت دوم عبارت کنترلی برای loop است ، و قسمت سوم اضافه کردن و

کم نمودن متغیر را ایجاد می کند.

مثال :

کد:
کد:
1: <html> 2: <head> 3: <title>Listing 5.8</title> 4: </head> 5: <body> 6: <?php 7: for ( $counter=1; $counter<=12; $counter++ ) 8: { 9: print "$counter times 2 is ".($counter*2)."<br>"; 10: } 11: ?> 12: </body> 13: </html>
در خط 7 بالا می توانید ببینید ، در قسمت اول counter را مساوی 1 نمودیم و در عبارت وسط محدود کردیم که حلقه تا وقتی کار کند که counter از 12 کوچکتر و یا مساوی آن باشد. در

قسمت سوم هم عبارتی است که هر بار که کد اجرا شود یک عدد به counter اضافه نماید.
مثال بالا و مثال قبلی هر دو یک خروجی را می دهند فقط کد for کمی جمع و جور تر از while است. به علت اینکه شروع ، پایان و شرایط حلقه در همان خط اول در For مشخص است ، با

یک نگاه به این نوع حلقه کل حقله دستمان می آید.

خروج از حلقه با استفاده از دستور break
در هر دو روش ایجاد حلقه دستوری برای پایان دادن حلقه وجود دارد. گاهی اوقات نیاز است که وقتی کد به شرایط خاصی رسید حلقه پایان یابد.
مثلا :

کد:
کد:
1: <html> 2: <head> 3: <title>Listing 5.9</title> 4: </head> 5: <body> 6: <?php 7: for ( $counter=1; $counter <= 10, $counter++ ) 8: { 9: $temp = 4000/$counter; 10: print "4000 divided by $counter is... $temp<br>"; 11: } 12: ?> 13: </body> 14: </html>
در کد بالا ما عدد 4000 رو بر counter که از 1 تا 10 متغیر است تقسیم می کنیم و خروجی را چاپ می کنیم. تا ایجا کد بدون نقص به نظر می رسد. ولی اگه مثلا counter از ورودی کاربر

گرفته شود و کاربر مثلا عددی منفی بزند یا صفر وارد نماید و یا اینکه یک کلمه به جای عدد وارد کند. در این صورت ما باید حلقه رو قطع کنیم چون می دونیم که تقسیم کردن یک عدد بر

صفر ایجاد خطا در php می کند.
مثلا فرض کنید از -4 شروع کنیم تا 10 این وسط صفر هم جزو مقادیر counter خواهد شد.

کد:
کد:
1: <html> 2: <head> 3: <title>Listing 5.10</title> 4: </head> 5: <body> 6: <?php 7: $counter = − 4; 8: for ( ; $counter <= 10; $counter++ ) 9: { 10: if ( $counter == 0 ) 11: break; 12: $temp = 4000/$counter; 13: print "4000 divided by $counter is... $temp<br>"; 14: } 15: ?> 16: </body> 17: </html>
در کد بالا همونطور که می بینید در خط 10 و 11 تعریف کردیم که اگه counter صفر شد حلقه قطع شود. بنابراین کد بعد از رسیدن به صفر و به break می رسد حلقه را قطع می نماید و به

خط 14 می رود.
نکته جالب در کد بالا در خط 7 است که ما counter را خارج از حلقه تعریف نمودیم. بنابراین در خط 8 دیگه counter رو تعریف نکردیم و جاش رو خالی گذاشتیم.
شما هر کدام از قسمتهای for رو می تونید خالی بگذارید ولی ; ها رو حتما باید بگذارید.

استفاده از دستور continue

خوب ، حالا فرض کنید که ما در کد بالا نمی خواهیم که وقتی به صفر رسید کد قطع شود و فقط می خواهیم که حلقه برای مقدار صفر اجرا نشود ولی باقی مقادیر اجرا شود. در این حالت

از دستور continue استفاده می کنیم.


کد:
کد:
1: <html> 2: <head> 3: <title>Listing 5.11</title> 4: </head> 5: <body> 6: <?php 7: $counter = − 4; 8: for ( ; $counter <= 10; $counter++ ) 9: { 10: if ( $counter == 0 ) 11: continue; 12: $temp = 4000/$counter; 13: print "4000 divided by $counter is... $temp<br>"; 14: } 15: ?> 16: </body> 17: </html>
در کد بالا در خط 10 و 11 وقتی مقدار counter صفر شود ، حلقه قطع می شود و دوباره کد بر می گردد به خط 8 ولی فقط مقدار صفر رو اجرا نخواهد کرد.

حلقه های تو در تو

در php این قابلیت رو دارید که در داخل یک حقله یک یا چند حلقه دیگه رو نیز بیارید. ولی باید توجه داشته باشید که هر حلقه ای که در یک حلقه دیگر استفاده می کنید باید در همان حلقه

تمام شود.
مثلا :

کد:
کد:
1: <html> 2: <head> 3: <title>Listing  5.12</title> 4: </head> 5: <body> 6: <?php 7:  print "<table border="1">\n"; 8: for ( $y=1; $y<=12; $y++ )  9: { 10:  print "<tr>\n"; 11: for ( $x=1; $x<=12; $x++ )  12: { 13:  print "\t<td>"; 14: print ($x*$y);  15: print "</td>\n"; 16: } 17: print "</tr>\n"; 18: } 19: print "</table>"; 20:  ?> 21:  </body>