- PHP從入門到精通(微視頻精編版)
- 明日科技
- 3971字
- 2020-11-23 14:41:13
第3章 流程控制語句
(視頻講解:51分鐘)
學習了PHP基礎后,相信讀者對PHP語言的基本運算有了一些了解,那么現在試著計算下面幾個問題:輸出10以內的偶數、計算100的階乘、列舉1000以內的所有素數。本章就來學習使用PHP語言中的流程控制語句解決上述問題。PHP的流程控制語句有兩種:條件控制語句和循環控制語句。合理使用這些控制結構可以使程序流程清晰、可讀性強,從而提高程序開發效率。
學習摘要:
if語句
switch語句
for循環語句
while循環語句
do…while循環語句
跳轉語句
3.1 條件控制語句

視頻講解
在生活中,我們總是要做出許多決策,程序也是一樣。下面給出幾個常見的例子:
如果購買成功,用戶余額減少,用戶積分增多。
如果輸入的用戶名和密碼正確,提示登錄成功,進入網站,否則,提示登錄失敗。
如果用戶使用微信登錄,則使用微信掃一掃;如果使用QQ登錄,則輸入QQ號和密碼;如果使用微博登錄,則輸入微博號和密碼;如果使用手機號登錄,則輸入手機號和密碼。
以上例子中的判斷,就是程序中的條件控制語句。按照條件選擇執行不同的代碼片段。條件控制語句主要有if、if…else、if…elseif…else和switch 4種。下面分別進行講解。
3.1.1 if語句
PHP的if語句的格式如下:

如果表達式的值為真,那么就順序執行語句;否則,就會跳過該條語句,再往下執行。如果需要執行的語句不止一條,那么可以使用“{}”,在“{}”中的語句被稱為語句組,其格式如下:

if語句的流程就像一輛運行的火車,從A站出發,可以直接到達C站,也可以經過B站,然后再到達C站,如圖3.1所示。

圖3.1 if語句流程控制圖
【例3.01】 使用rand()函數生成一個隨機數$num,然后判斷這個隨機數是不是偶數,如果是,則輸出結果。代碼如下:(實例位置:資源包\源碼\03\3.01)

運行結果如圖3.2所示。

圖3.2 判斷隨機數是否為偶數
說明
rand()函數的作用是取得一個隨機的整數,每次刷新頁面后,會生成一個新的隨機數,可能與圖3.2所示不同。
3.1.2 if…else語句
大多時候,總是需要在滿足某個條件時執行一條語句,而在不滿足該條件時執行其他語句。這時可以使用if…else語句,該語法格式如下:

該語句的含義為:當表達式的值為真時,執行語句1;如果表達式的值為假,則執行語句2。就像一輛運行的火車,只有兩條軌道可以選擇,如圖3.3所示。

圖3.3 if…else語句流程控制圖
3.1.3 elseif語句
if…else語句只能選擇兩種結果:要么執行語句1,要么執行語句2。但有時會出現兩種以上的選擇,例如,一個班的考試成績,如果是90分以上,則為“優秀”;如果是60~90分的,則為“良好”;如果低于60分,則為“不及格”。這時可以使用elseif語句來執行,語法格式如下:

elseif語句的流程就像一輛運行的火車,從A站出發到達B站,有多條線路可以選擇,根據鐵路局的不同指示,選擇相應的路線,如圖3.4所示。

圖3.4 elseif語句的流程控制圖
【例3.02】 通過elseif語句,判斷今天是這個月的上、中或下旬。代碼如下:(實例位置:資源包\源碼\03\3.02)

運行結果如圖3.5所示。

圖3.5 判斷是上、中或下旬
3.1.4 switch語句
雖然elseif語句可以進行多種選擇,但如果條件較多時,就會變得十分煩瑣。為了避免if語句過于冗長,提高程序的可讀性,可以使用switch分支控制語句。switch語句的語法格式如下:

switch語句根據變量或表達式的值,依次與case中常量表達式的值相比較,如果不相等,繼續查找下一個case;如果相等,就執行對應的語句,直到switch語句結束或遇到break為止。一般來說,switch語句最終都有一個默認值default,如果在前面的case中沒有找到相符的條件,則輸出默認語句,和else語句類似。
【例3.03】 明日學院網站支持第三方登錄,第三方登錄包括QQ登錄、微信登錄、微博登錄等。根據不同的登錄方式,需要調用相應的第三方接口,這時,可以根據網址中傳遞的值不同,使用switch語句判斷用戶選擇了哪一個第三方應用,然后調用該應用的接口。代碼如下:(實例位置:資源包\源碼\03\3.03)

運行結果如圖3.6所示。

圖3.6 switch多重判斷語句
注意
switch語句在執行時,即使遇到符合要求的case語句段,也會繼續往下執行,直到switch語句結束。為了避免這種浪費時間和資源的行為,一定要在每個case語句段后加上break語句。這里break語句的意思是跳出當前循環,在3.3.1節中將詳細介紹break語句。
3.2 循環控制語句

視頻講解
對于大多數人來說,反復地做同樣的事情會讓人厭煩,但是對計算機而言,它們卻非常擅長去完成重復的任務。計算機程序通常會周而復始地重復同樣的步驟,這稱為循環。循環主要有兩種類型:
重復一定次數的循環,稱為計數循環,如for循環。
重復直至發生某種情況時結束的循環,稱為條件循環(conditional loop),因為只要條件為真,這種循環會一直持續下去,如while循環和do…while循環。
3.2.1 for循環語句
for循環是PHP的計數循環結構,它的語法格式如下:

其中,初始化表達式在第一次循環時無條件取一次值;條件表達式在每次循環開始前求值,如果值為真,則執行循環體里面的語句,否則跳出循環,繼續往下執行;迭代表達式在每次循環后被執行。for循環語句的流程控制圖如圖3.7所示。

圖3.7 for循環語句的流程控制圖
我們以現實生活中的例子來理解for循環的執行流程。在體育課上,體育老師要求同學們沿著環形操場跑步3圈。老師從0開始計數,每次跑完1圈,將數量加1。當完成第3圈時,同學會停下來,即循環結束。
【例3.04】 通過for循環來計算100的階乘,即1×2×3×4×…×100。代碼如下:(實例位置:資源包\源碼\03\3.04)

上述代碼中,第一步,執行for循環的初始表達式,即為$i賦值為1。第二步,判斷條件表達式,即$i是否小于或等于100,如果判斷的結果為真,則執行下面的程序塊,將$sum乘以當前的$i;否則跳出循環,不再繼續執行。第三步,執行迭代表達式,即將$i加1。此時,第一次循環結束,$i的值為2。然后判斷$i是否小于或等于100,重復第一次的操作。當$i為100時,執行第100次程序塊代碼。然后$i繼續迭代,值為101。此時,判斷表達式的結果為假,循環結束,不再執行。運行結果如圖3.8所示。

圖3.8 for循環計算階乘
注意
在for語句中當采用循環變量遞增或遞減的方式時,一定要保證循環能夠結束,無期限的循環(死循環)將導致程序崩潰。
3.2.2 while循環語句
while循環是PHP中條件循環語句的一種,它的語法格式如下:

當表達式的值為真時,將執行循環體內的PHP語句。執行結束后,再返回到表達式繼續進行判斷。直到表達式的值為假,才跳出循環。
while循環語句的流程控制圖如圖3.9所示。

圖3.9 while語句的流程控制圖
我們同樣以沿著操場跑步的例子來理解while循環。這一次,老師沒有要求同學們跑幾圈,而是要求當聽到老師吹的哨子聲時就停下來。同學們每跑一圈,可能會請求一次老師吹哨子。如果老師吹哨子,則停下來,即循環結束;否則,繼續跑步,即執行循環。
【例3.05】 依次判斷1~10以內的數是否為偶數,如果是,則輸出;如果不是,則繼續下一次循環。代碼如下:(實例位置:資源包\源碼\03\3.05)

運行結果如圖3.10所示。

圖3.10 while循環輸出10以內的偶數
3.2.3 do…while循環語句
while語句還有另一種形式的表示,即do…while。兩者的區別在于,do…while要比while語句多循環一次。當while表達式的值為假時,while循環直接跳出當前循環;而do…while語句則是先執行一遍程序塊,然后再對表達式進行判斷。do…while語句的流程控制圖如圖3.11所示。

圖3.11 do…while循環語句的流程控制圖
依然以沿著操場跑步的例子來理解do…while循環。這一次,老師要求同學們先跑1圈,然后當聽到老師吹的哨子聲時再停下來。
【例3.06】 分別使用while語句和do…while語句執行相同的代碼塊,即使用echo語句輸出一段內容,并對比兩個語句的區別。代碼如下:(實例位置:資源包\源碼\03\3.06)

運行結果如圖3.12所示。

圖3.12 while和do…while的區別
3.3 跳轉語句

視頻講解
當循環條件一直滿足時,程序將會一直執行下去,就像一輛迷路的車,在某個地方不停地轉圓圈。如果希望在中間離開循環,也就是for循環結束計數之前,或者while循環找到結束條件之前,用以下兩種方法來做到。
break:完全中止循環。
continue:直接跳到循環的下一次迭代。
3.3.1 break語句
break語句可以終止當前的循環,包括while、do…while、for和switch在內的所有控制語句。以獨自一人沿著操場跑步為例,計劃跑步10圈。可是在跑到第2圈時,遇到自己的女神或者男神,于是果斷停下來,終止跑步,這樣就提前終止循環。
【例3.07】 使用一個while循環,while后面的表達式的值為true,即為一個無限循環。在while程序塊中聲明一個隨機數變量$tmp,只有當生成的隨機數等于10時,使用break語句跳出循環。代碼如下:(實例位置:資源包\源碼\03\3.07)

運行結果如圖3.13所示。

圖3.13 break語句退出循環
3.3.2 continue語句
continue語句的作用沒有break強大,continue只能終止本次循環而進入到下一次循環中,continue也可以指定跳出幾重循環。
以獨自一人沿著操場跑步為例,計劃跑步10圈。當跑到第2圈一半的時候,遇到自己的女神或者男神也在跑步,于是果斷停下來,跑回起點等待,制造一次完美邂逅,然后從第3圈開始繼續。
【例3.08】 使用for循環輸出0~4,當$i等于2時,執行continue語句,此時不執行下面的print語句,跳出該循環,繼續執行$i等于3的語句。代碼如下:(實例位置:資源包\源碼\03\3.08)

運行結果如圖3.14所示。

圖3.14 continue語句跳出循環
3.4 小結
本章通過幾個簡單的數學題學習了PHP的流程控制語句。流程控制語句是程序中必不可少的,也是變化最豐富的技術。無論是入門的數學公式,還是高級的復雜算法,都是通過這幾個簡單的語句來實現的。相信讀者學習完本章之后,通過不斷地練習和總結,能夠掌握一套自己的方法和技巧。
3.5 實戰
3.5.1 驗證高斯定理
實例位置:資源包\源碼\03\實戰\01
使用for循環驗證高斯求和1+2+3+…+100之和。運行結果為5050,如圖3.15所示。

圖3.15 實例運行結果
3.5.2 輸出三角形金字塔
實例位置:資源包\源碼\03\實戰\02
輸出一個形狀呈三角形的金字塔。該金字塔共5行,第1行1顆星,第2行3顆星,第3行5顆星,第4行7顆星,第5行9顆星。運行結果如圖3.16所示。

圖3.16 實例運行結果
3.5.3 將學生成績轉化為等級
實例位置:資源包\源碼\03\實戰\03
將學生成績轉化為等級,劃分標準如下:
①優秀:大于等于90分。
②良好:大于等于80分,小于90分。
③及格:大于等于60分,小于80分。
④不及格:小于60分。
使用rand()函數隨機生成成績,輸出與該成績對應的等級。運行結果如圖3.17所示。

圖3.17 實例運行結果
- 計算機網絡
- ClickHouse性能之巔:從架構設計解讀性能之謎
- Hands-On Machine Learning with scikit:learn and Scientific Python Toolkits
- Building a Game with Unity and Blender
- 軟件界面交互設計基礎
- 深入淺出Windows API程序設計:編程基礎篇
- 人人都是網站分析師:從分析師的視角理解網站和解讀數據
- MongoDB,Express,Angular,and Node.js Fundamentals
- JavaScript動態網頁編程
- RubyMotion iOS Develoment Essentials
- Natural Language Processing with Python Quick Start Guide
- Python自然語言理解:自然語言理解系統開發與應用實戰
- Arduino機器人系統設計及開發
- 創新工場講AI課:從知識到實踐
- Splunk Essentials