for語句可以說是PHP(同時也是多種語言)的循環(huán)控制部份最基本的一個語句了,for語句的執(zhí)行規(guī)律和基礎(chǔ)用法在這里就不多說,可以參見PHP手冊for語句部分.PHP手冊中對它的語法定義如下:
for 循環(huán)語句是 PHP 語言中最復(fù)雜的一種循環(huán)語句.它的語法如下:
for (expr1; expr2; expr3)statement
實例代碼如下:
- <html>
- <body>
- <?phpfor ($i=1; $i<=5; $i++){ echo $i ;}?>
- </body>
- ?</html>
該實例返回的顯示結(jié)果是:12345
下面說說for語句幾種有用的變型.
1、無限循環(huán)
首先是人盡皆知的無限循環(huán)(亦可稱“死循環(huán)”).由于空表達式null在語法上是有效的,所以我們可以把for語句的三個表達式留空,這樣就會產(chǎn)生不斷執(zhí)行for嵌套語句的效果.
實例代碼如下:
- <?php
- for (;;) {
- //放置需要不斷執(zhí)行的語句
- }
- ?>
雖然有一些任務(wù)會使用到無限循環(huán),但是大多數(shù)程序任務(wù),特別是PHP所能涉及的領(lǐng)域,在使用無限循環(huán)時都會添加一些終止循環(huán)的條件.
實例代碼如下:
- <?php
- for (;;) {
- //如果是公元2199年,則跳出循環(huán)
- if (date('Y') == '2199') {
- break;
- }
- }
- ?>
2、使用空表達式
接下來就是說說在初始化語句expr1中使用null語法,留空expr1最常見的作用就是完成更為復(fù)雜的初始化工作.
實例代碼如下:
- <?php
- if (isset($i)) {
- unset($i);
- if ((int) date('') < 2008) {
- $i = 0;
- } else {
- $i = 1;
- }
- } else {
- $i =3;
- }
- for (;$i < 10;$i++) {
- echo $i;
- }
- ?>
同樣道理,迭代表達式expr3也可能留空,也可以利用這點編寫更為復(fù)雜的迭代式,比如說根據(jù)不同的條件調(diào)用不同的迭代式.
而for語句中的條件語句expr2留空則是上面所說的無限循環(huán),當(dāng)然也可以添加一些更為復(fù)雜的條件去判斷什么時候跳出循環(huán),在此不在重復(fù).
3、多重循環(huán)
使用多重循環(huán)來控制多個變量也是在for語句中使經(jīng)常被忽略的一個特性.如下面的例子,在一般的任務(wù)中用到的一般會是雙重循環(huán),三重以上的循環(huán)一般意義不大.
實例代碼如下:
以上代碼將輸出:
- <?php
- for ($i = 0, $j = 10;$i <= 10;$i++, $j--) {
- echo "$i + $j = 10rn";
- }
- ?>
0 + 10 = 10
1 + 9 = 10
2 + 8 = 10
3 + 7 = 10
4 + 6 = 10
5 + 5 = 10
6 + 4 = 10
7 + 3 = 10
8 + 2 = 10
9 + 1 = 10
10 + 0 = 10
4、更為復(fù)雜的表達式
如果把for語句的三個表達式寫得復(fù)雜一些,則可以用于優(yōu)化算法.甚至可以使用沒有循環(huán)體的for語句來完成一些任務(wù).比如計算累加或階乘:
實例代碼如下:
- //計算1-5的累加結(jié)果,斌值到$j
- for ($i = 1,$j = 0; $i <= 5;$j += $i++);
- echo $j;
- //計算1-5的階乘結(jié)果,斌值到$j
- for ($i = 1,$j = 1; $i <= 5;$j *= $i++);
- echo $j;
- ?>
利用for循環(huán)返回近三個月的數(shù)據(jù).我們都知道,利用str_pad(intval($month),2,0,STR_PAD_LEFT)可以很方便的獲得上月的時間.
實例代碼如下:
- <?php
- $y = date('Y');//獲取當(dāng)前時間年份
- $m = date('m');//獲取當(dāng)前時間月份
- if($m == 1) $time = ($y-1).'-12';//如果是1月份,則上個月就是去年的12月,所以這里的年份要減去1
- else $time = $y."-".str_pad(intval($m-1),2,0,STR_PAD_LEFT);//獲取上個月時間
- ?>
如果需要前三個月數(shù)據(jù)的話,顯然這樣的處理方式還不夠,且類似的代碼反復(fù)執(zhí)行,效率不高,這時候選擇for循環(huán)就對了.
實例代碼如下:
- <?php
- //for循環(huán)變量說明 $sm為起始月份 $em為結(jié)束月份 $ny為實際年份
- if($m == 1)
- {
- $sm = 11;//當(dāng)前月份是1月,以前三個月計算的話,起始月份就是去年11月
- $em = 13;//這里做為for循環(huán)結(jié)束標(biāo)記,結(jié)束月份是今年1月,加上12只是便于循環(huán)
- }
- elseif($m == 2)
- {
- $sm = 12;//同上
- $em = 14;
- }
- else
- {
- $sm = $m - 3;
- $em = $m;
- }
- for($x=$sm;$x<$em;$x++)
- {
- if($m == 1 || $m == 2)
- {
- if($x >= 11) $ny = $y - 1;//實際年份是去年
- if($x >= 13) $x = $x - 12;//實際月份是今年
- }
- else $ny = $y;
- //年份、月份都順利得到了,后面就好辦了……
- }
- ?>
新聞熱點
疑難解答