思考:平常針對(duì)業(yè)務(wù)需求編寫的代碼通常以行為單位今魔,那么代碼的執(zhí)行邏輯是什么樣子的呢增热?
引入:正常情況下玄组,代碼就是按照編寫的順序從上往下逐行執(zhí)行的滔驾,但是我們不能確保用戶在操作的時(shí)候就完全按照指定的代碼流程執(zhí)行。所以俄讹,在這個(gè)時(shí)候哆致,就會(huì)需要用到一些流程控制來確保代碼能夠按照正確的方向執(zhí)行。
流程控制【了解】
定義:所謂流程控制患膛,就是在代碼邏輯中增加一些“開關(guān)”沽瞭,讓代碼可以按照正常的業(yè)務(wù)需求運(yùn)行到最后。
1.在PHP中剩瓶,流程控制分為三種:順序結(jié)構(gòu)驹溃、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)
- 順序結(jié)構(gòu):是最普遍的一種結(jié)構(gòu),不需要人為控制延曙,就是代碼按照編寫的順序從上往下逐行執(zhí)行
<?php
//定義變量
$a = 100; //PHP解釋器先解釋第一行代碼
//輸出結(jié)果
echo $a; //PHP解釋器順序執(zhí)行第二行代碼
?>
- 分支結(jié)構(gòu):需要人為控制豌鹤,將可能發(fā)生的結(jié)果對(duì)應(yīng)的代碼塊,按照指定的條件去判斷執(zhí)行枝缔,通常情況下是根據(jù)條件選擇一個(gè)對(duì)應(yīng)的代碼塊執(zhí)行
- 循環(huán)結(jié)構(gòu):是代碼高效解決重復(fù)問題的一種方式布疙,通常是設(shè)定變化條件蚊惯,然后讓代碼塊在指定范圍內(nèi)重復(fù)執(zhí)行
總結(jié):代碼的流程控制是程序員開發(fā)程序時(shí)要掌握的基本技巧,也是程序能夠解決復(fù)雜的業(yè)務(wù)需求的根本所在灵临。
分支結(jié)構(gòu)
思考:用戶在網(wǎng)購的時(shí)候需要選擇支付方式截型,我們的代碼實(shí)現(xiàn)是根據(jù)用戶選擇的方式來動(dòng)態(tài)生成支付代碼的嗎?
引入:代碼理論上到目前為止還沒有所謂動(dòng)態(tài)生成的概念儒溉,即根據(jù)用戶不同的選擇來臨時(shí)生成解決方案宦焦,都是先把能夠支持用戶操作的代碼寫好,只是隨著用戶的選擇而執(zhí)行不同的代碼而已顿涣。
IF分支結(jié)構(gòu)【掌握】
定義:IF是如果的意思波闹,言外之意是如果某種條件達(dá)到,再去執(zhí)行某一件事涛碑。IF分支就是根據(jù)條件來分出不同的“支流”精堕,每個(gè)支流有對(duì)應(yīng)的解決方案。if中所有條件需求的結(jié)果都是使用布爾類型蒲障,如果提供的是非布爾類型歹篓,那么系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)換成布爾結(jié)果。
1.IF分支語法:if分支根據(jù)業(yè)務(wù)的復(fù)雜性可以分為三種揉阎,即簡單if分支滋捶、標(biāo)準(zhǔn)if分支和復(fù)雜if分支
2.簡單if分支:簡單的if分支是只有一個(gè)代碼塊,達(dá)到某個(gè)指定的條件才會(huì)執(zhí)行余黎,否則不執(zhí)行對(duì)應(yīng)的代碼塊重窟。語法規(guī)則為:
if(條件){
滿足條件要執(zhí)行的代碼塊
}
<?php
//只支持支付寶支付
$choice = '支付寶';
if($choice != '支付寶'){
//條件匹配:用戶的選擇不是支付寶 $choice != '支付寶' 結(jié)果為true
echo '目前僅支持支付寶支付';
exit; //表示代碼終止執(zhí)行
}
?>
3.標(biāo)準(zhǔn)if分支:通常是要解決條件的滿足于不滿足情況,滿足條件時(shí)對(duì)應(yīng)的代碼塊會(huì)執(zhí)行惧财,不滿足條件時(shí)對(duì)應(yīng)的另外一個(gè)代碼塊會(huì)執(zhí)行:言外之意兩個(gè)代碼塊一定執(zhí)行其中一個(gè)(只有一個(gè))巡扇。語法規(guī)則為:
if(條件){
滿足條件要執(zhí)行的代碼塊
}else{
不滿足條件要執(zhí)行的代碼塊
}
<?php
//如果不是支付寶支付就是微信支付
$choice = '支付寶';
if($choice == '支付寶'){
echo '支付寶支付';
}else{
echo '微信支付';
}
?>
3.復(fù)雜if分支:這種通常是條件對(duì)應(yīng)的結(jié)果通常會(huì)大于兩個(gè),不是非黑即白垮衷。因此在進(jìn)行一輪條件匹配后厅翔,還要進(jìn)行第二輪甚至更多輪的條件匹配。語法規(guī)則為:
if(條件1){
滿足條件1要執(zhí)行的代碼塊
}elseif(條件2){
滿足條件2要執(zhí)行的代碼塊
... //表示可以有任意多個(gè)條件
}else{
不滿足全部條件要執(zhí)行的代碼塊
}
<?php
//支持多種支付
$choice = '微信';
if($choice == '支付寶'){
echo '支付寶支付'; //如果條件滿足為支付寶搀突,那么執(zhí)行支付寶支付
}elseif($choice == '微信'){
echo '微信支付'; //如果條件滿足為微信:那么支付寶條件不滿足刀闷,執(zhí)行微信支付
}else{
echo '其他支付'; //如果條件不是支付寶也不是微信,那么執(zhí)行其他支付
}
?>
4.在PHP中elseif和else if同時(shí)支持仰迁,效果等同甸昏。
<?php
//支持多種支付
$choice = '微信';
if($choice == '支付寶'){
echo '支付寶支付'; //如果條件滿足為支付寶,那么執(zhí)行支付寶支付
}else if($choice == '微信'){
echo '微信支付'; //如果條件滿足為微信:那么支付寶條件不滿足徐许,執(zhí)行微信支付
}else{
echo '其他支付'; //如果條件不是支付寶也不是微信施蜜,那么執(zhí)行其他支付
}
?>
5.其實(shí)多條件分支(復(fù)雜if分支),也可以使用標(biāo)準(zhǔn)分支來實(shí)現(xiàn)雌隅,但是這個(gè)使用需要使用if嵌套:即在else的代碼塊中再次使用if進(jìn)行條件判斷
<?php
//支持多種支付
$choice = '微信';
if($choice == '支付寶'){
echo '支付寶支付'; //如果條件滿足為支付寶翻默,那么執(zhí)行支付寶支付
}else{
//所有不是支付寶支付條件都會(huì)進(jìn)入到else中缸沃,可以在else中再次篩選條件
if($choice == '微信'){
echo '微信支付'; //如果條件滿足為微信:那么支付寶條件不滿足,執(zhí)行微信支付
}else{
echo '其他支付'; //如果條件不是支付寶也不是微信修械,那么執(zhí)行其他支付
}
}
?>
6.IF分支注意事項(xiàng):如果條件變換是有序漸進(jìn)的趾牧,那么在漸進(jìn)條件編寫的時(shí)候,一定要注意條件變換的順序性肯污,以及發(fā)生條件區(qū)間封閉性翘单。如按照年齡來劃分人所處某一類人的時(shí)候,一定是最狹窄的條件先判定(滿足的概率偏谐鹣洹),最后是最寬的條件东羹。
<?php
$age = 50;
if($age <= 20){ //年齡小于20是最狹窄的剂桥,不能先年齡小于50或者更大
echo '青少年';
}elseif($age <= 50){
echo '中年';
}else{
echo '老年';
}
?>
7.練習(xí):如果上述案例想做成不論條件順序都不會(huì)出錯(cuò),請(qǐng)問要如何實(shí)現(xiàn)属提?
總結(jié):IF分支結(jié)構(gòu)在日常代碼編寫中非常常見权逗,因?yàn)闃I(yè)務(wù)的操作通常為了表示用戶的友好性,會(huì)在很多地方給用戶提供條件選擇冤议。而且在業(yè)務(wù)代碼發(fā)展過程中斟薇,會(huì)經(jīng)常根據(jù)運(yùn)算結(jié)果進(jìn)行不同的操作,也會(huì)用到分支結(jié)構(gòu)恕酸。if分支有多種堪滨,具體選擇規(guī)則如下:
- 如果只是確定代碼是否繼續(xù)執(zhí)行,通常采用簡單if分支:只需要在條件中找出不讓代碼執(zhí)行的結(jié)果即可(如簡單if示例)
- 如果不論結(jié)果如何都有代碼執(zhí)行蕊温,通常選擇標(biāo)準(zhǔn)if分支:兩個(gè)代碼塊一定會(huì)有一個(gè)執(zhí)行
- 如果條件判定不是一次就可以解決袱箱,可以使用復(fù)雜if分支或者嵌套if分支
思考:IF分支結(jié)構(gòu)能夠處理全部條件判斷需求,但是如果條件很多的時(shí)候义矛,要寫很多的if-else語句塊发笔,結(jié)構(gòu)會(huì)顯得很臃腫,有沒有其他簡潔一點(diǎn)的方法呢凉翻?
引入:如果條件在不是很統(tǒng)一的情況下了讨,即便真有這樣的需求也確實(shí)需要使用復(fù)雜IF結(jié)構(gòu),但是如果條件很多制轰,但是每個(gè)條件都是很明確的情況下(具體常量:此常量非PHP常量前计,而是具體的數(shù)據(jù),如數(shù)值或者字母)垃杖,確實(shí)有一種能夠更方便的方法残炮,那就是Switch分支結(jié)構(gòu)。
Switch分支結(jié)構(gòu)【掌握】
定義:Switch也是一種通過條件匹配來選擇執(zhí)行代碼塊的分支結(jié)構(gòu)缩滨,但是Switch的條件只有一個(gè)(只需要寫一次)势就,而且運(yùn)行機(jī)制與if分支結(jié)構(gòu)不一樣泉瞻。
1.基本語法
switch(條件變量){
case 匹配值1:
//滿足條件執(zhí)行的代碼塊;
break; //結(jié)束分支結(jié)構(gòu)
case 匹配值2:
//滿足條件執(zhí)行的代碼塊;
break;
...
default:
//條件都不匹配執(zhí)行的代碼塊;
break;
}
2.語法解釋:
- 條件變量不是一個(gè)運(yùn)算,是一個(gè)純粹的變量
- 匹配值就是變量可能代表的值
- break是每個(gè)case需要的結(jié)束符號(hào)苞冯,如果沒有會(huì)繼續(xù)向下執(zhí)行
- default存在就是在匹配不到的情況下執(zhí)行袖牙,default可以沒有,代表匹配不到條件就不做任何事情
<?php
//根據(jù)用戶的選擇來選擇對(duì)應(yīng)的支付方式
$choice = '支付寶';
switch($choice){
case '支付寶':
echo '支付寶支付'; //當(dāng)$choice的值為支付寶時(shí)執(zhí)行
break; //執(zhí)行結(jié)束后結(jié)束switch:如果沒有break舅锄,繼續(xù)執(zhí)行微信的代碼塊鞭达,直到遇到break或者switch結(jié)束
case '微信':
echo '微信支付';
break;
case '比特幣':
echo '比特幣支付';
break;
case '儲(chǔ)蓄卡':
echo '儲(chǔ)蓄卡支付':
break;
default:
echo '現(xiàn)金支付';
break; //最后一個(gè)break可以省略(不管是不是在default后)
}
?>
3.switch分支與if分支的區(qū)別
- switch分支的條件與if分支不同,if分支比較靈活皇忿,可以是變量也可以是運(yùn)算表達(dá)式畴蹭,而switch只能是變量(而且變量通常是連續(xù)的數(shù)據(jù))
- if分支的條件是從第一個(gè)開始挨個(gè)匹配,而switch的邏輯不一樣鳍烁,不需要挨個(gè)匹配叨襟,是直接到達(dá)目標(biāo)case(因此如果是對(duì)于多條件而言,使用switch比if實(shí)現(xiàn)效率要高一些幔荒;如果是簡單匹配if效率高)
- if分支匹配糊闽,永遠(yuǎn)最多執(zhí)行一個(gè)代碼塊(匹配成功的),而switch如果在不使用break的情況下爹梁,可以執(zhí)行多個(gè)條件對(duì)應(yīng)的代碼塊
4.練習(xí):根據(jù)給定的數(shù)字1-7輸出對(duì)應(yīng)的星期幾右犹。
總結(jié):Switch分支結(jié)構(gòu)是用來處理?xiàng)l件多且有規(guī)律的分支情形,相對(duì)于if有優(yōu)勢也有劣勢(條件匹配不夠靈活)姚垃。在實(shí)際開發(fā)中要根據(jù)當(dāng)前業(yè)務(wù)的數(shù)據(jù)特點(diǎn)來選擇對(duì)應(yīng)的分支結(jié)構(gòu)念链。
循環(huán)結(jié)構(gòu)
思考:有一些業(yè)務(wù)情況下,可能需要某些代碼重復(fù)執(zhí)行N次积糯,難道在編寫代碼的時(shí)候割疾,是將一行代碼復(fù)制多行來解決嗎唠粥?
引入:實(shí)際開發(fā)中芳来,的確有很多情況下捉超,需要某些代碼在部分有規(guī)律變化的情況下,重復(fù)的執(zhí)行绍昂,為了解決這一問題啦粹,提升程序員的開發(fā)效率,系統(tǒng)提供了循環(huán)結(jié)構(gòu)來控制執(zhí)行重復(fù)代碼窘游。
for循環(huán)【掌握】
定義:for循環(huán)是一種能夠在循環(huán)結(jié)構(gòu)內(nèi)部設(shè)定初始化條件唠椭、邊界值以及條件控制的循環(huán)結(jié)構(gòu),也是一個(gè)將條件與要重復(fù)執(zhí)行的代碼分開管理的一種循環(huán)結(jié)構(gòu)忍饰,通常是根據(jù)某些有特定變化規(guī)律的條件來實(shí)現(xiàn)贪嫂。
1.基礎(chǔ)語法
for(初始化條件;條件判定;條件變更)
{
//要重復(fù)執(zhí)行的代碼(循環(huán)體)
}
2.解釋
- 初始化條件:循環(huán)進(jìn)入的開始條件,如果有需求也可以在此定義多個(gè)條件艾蓝,使用逗號(hào)分隔(通常是設(shè)定變量初始值和邊界值)力崇,是for循環(huán)執(zhí)行的第一段代碼(只執(zhí)行一次)
- 條件判定:是進(jìn)入循環(huán)內(nèi)部執(zhí)行循環(huán)體的門檻斗塘,在此判斷條件是否符合(通常是一個(gè)比較表達(dá)式),符合就進(jìn)入循環(huán)內(nèi)部(循環(huán)體)亮靴,不符合就直接結(jié)束循環(huán)馍盟,是for循環(huán)執(zhí)行的第二段代碼(循環(huán)執(zhí)行)
- 循環(huán)體:要重復(fù)執(zhí)行的代碼塊,是for循環(huán)執(zhí)行的第三段代碼(循環(huán)執(zhí)行)
- 條件變更:是在循環(huán)結(jié)束后茧吊,對(duì)循環(huán)條件的變化語句(通常是自變量贞岭,自增++或者自減--),是for循環(huán)執(zhí)行的第四段代碼(循環(huán)執(zhí)行)
- 循環(huán)執(zhí)行:就是代碼從初始化條件后搓侄,不斷的重復(fù)執(zhí)行條件判定瞄桨、循環(huán)體和條件變更的過程,直到條件判定結(jié)束
- 循環(huán)控制的條件變量(條件變更讶踪,通常也就是初始化條件)在循環(huán)執(zhí)行結(jié)束后是可以在外部使用的芯侥,其代表的數(shù)據(jù)就是條件判定不滿足的第一個(gè)值
<?php
//輸出1-100之間的整數(shù)
//分析:初始條件應(yīng)該是從1開始,結(jié)束條件應(yīng)該是數(shù)據(jù)大于100俊柔,條件的變化每次是1(整數(shù))
for($i = 1;$i <= 100;$i++){
echo $i,' '; //echo后可以使用逗號(hào)分隔輸出多個(gè)內(nèi)容
//初始化條件: $i = 1 //只執(zhí)行一次:第一次
//條件判定: $i <= 100 //執(zhí)行101次筹麸,$i最后一次為101
//循環(huán)體: echo $i,' ' //執(zhí)行100次
//條件變更: $i++ //$i每次在原來基礎(chǔ)上+1(執(zhí)行100次)
}
//循環(huán)后使用條件變量
echo $i; //101活合,第一個(gè)大于邊界值100的數(shù)據(jù)
?>
3.特殊情況下使用for條件:for循環(huán)的條件并非一定需要雏婶,如果本身在循環(huán)內(nèi)部(循環(huán)體)就可以控制循環(huán)的執(zhí)行(不要成為死循環(huán)),for循環(huán)中的初始化條件白指、條件判定和條件變更可以都不需要
<?php
//無條件for循環(huán):極端使用留晚,初始化條件、條件判定和條件變更都沒有
for(;;){
//沒有任何循環(huán)條件
//循環(huán)體
//一定要有循環(huán)控制(后學(xué))告嘲,要不然就是死循環(huán)(導(dǎo)致內(nèi)存崩潰)
}
?>
4.練習(xí):輸出1到100之間所有數(shù)的立方和错维。
總結(jié):for循環(huán)多用于有規(guī)律的數(shù)值條件循環(huán),能夠通過條件的起始和結(jié)尾來對(duì)循環(huán)本身進(jìn)行控制橄唬。
思考:for循環(huán)是比較適合規(guī)律性數(shù)值條件的循環(huán)赋焕,如果有些條件沒那么明顯的情況下,還能使用循環(huán)嗎仰楚?
引入:循環(huán)通常只要有確定的條件即可隆判,for循環(huán)是比較適合規(guī)律性數(shù)值條件的循環(huán),但是其實(shí)也可以應(yīng)用在規(guī)律性不強(qiáng)的條件方面僧界,只是通常還有其他循環(huán)方式侨嘀,如while循環(huán)。
While循環(huán)【掌握】
定義:while循環(huán)捂襟,是一種在循環(huán)外定義初始化條件的一種循環(huán)方式咬腕。
1.基礎(chǔ)語法
while(循環(huán)條件)
{
//循環(huán)體
}
2.解釋:while循環(huán)通常是在循環(huán)外部定義循環(huán)條件(條件變量),然后在循環(huán)體中執(zhí)行循環(huán)條件的變化
<?php
//輸出1到100的整數(shù)
$i = 1; //定義初始化變量
while($i <= 100){
//循環(huán)體
echo $i; //如果到這結(jié)束:那么循環(huán)就進(jìn)入死循環(huán)葬荷,因?yàn)?i永遠(yuǎn)為1涨共,從而小于等于100
//變更循環(huán)條件
$i++; //在循環(huán)體中控制循環(huán)變量
}
?>
3.while循環(huán)與for循環(huán)的區(qū)別:二者沒有本質(zhì)區(qū)別纽帖,都可以實(shí)現(xiàn)各種循環(huán)。區(qū)別在于形式上:for循環(huán)是將條件與循環(huán)體控制在for循環(huán)自己內(nèi)部煞赢,而while循環(huán)通常需要在外部定義循環(huán)條件抛计,同時(shí)如果是需要手動(dòng)條件變更,則需要在循環(huán)體中出現(xiàn)照筑。
4.練習(xí):輸出1-100之間所有的基數(shù)吹截。
總結(jié):while循環(huán)和for循環(huán)一樣都可以解決循環(huán)問題,for循環(huán)通常用來解決那些條件明確的循環(huán)凝危,while循環(huán)通常用來解決一些條件不夠確定的循環(huán)(不知道什么時(shí)候結(jié)束)波俄。
思考:for循環(huán)和while循環(huán)都是先判定條件后執(zhí)行循環(huán)的結(jié)構(gòu),如果有時(shí)候想不論如何都執(zhí)行一次循環(huán)該怎么實(shí)現(xiàn)呢蛾默?
引入:首先在循環(huán)結(jié)構(gòu)要解決的業(yè)務(wù)情形中懦铺,這種繞過條件先執(zhí)行循環(huán)體的需求很少。但是也并非沒有支鸡,如果有需要的話可以使用do-while循環(huán)冬念。
do-while循環(huán)【了解】
定義:do-while循環(huán),顧名思義牧挣,先“做”后循環(huán)急前,即先執(zhí)行循環(huán)體,后判定循環(huán)條件來決定是否繼續(xù)執(zhí)行瀑构。
1.基礎(chǔ)語法
do{
//循環(huán)體
}while(條件); //注意:因?yàn)閐o-while不是花括號(hào)結(jié)束裆针,所以需要使用語句結(jié)束符
2.解釋:do后跟循環(huán)體,表示循環(huán)一開始先執(zhí)行循環(huán)體寺晌,后判定while中的條件:條件符合繼續(xù)執(zhí)行循環(huán)體世吨;條件不符合結(jié)束循環(huán)
<?php
//求100以內(nèi)的基數(shù)和
$i = 1;
$res = 0; //定義先決條件
do{
$res += $i; //累計(jì)求和
$i++; //條件變更
}while($i <= 100); //條件判定
?>
3.do-while與while的區(qū)別:do-while和while都是執(zhí)行循環(huán),區(qū)別在于while是先判定條件呻征,而do-while是先執(zhí)行循環(huán)體耘婚。言外之意,while有可能循環(huán)體一次都不執(zhí)行陆赋,而do-while一定會(huì)執(zhí)行至少一次沐祷。
總結(jié):do-while在PHP實(shí)際開發(fā)應(yīng)用中,使用的很少奏甫。實(shí)現(xiàn)的效果比while循環(huán)通常不過是少一次條件判定戈轿,這個(gè)在PHP效率中不值得特別計(jì)較。但是do-while在C語言中使用還是比較多的(宏)阵子。
思考:以上循環(huán)都是針對(duì)單個(gè)有規(guī)律或者無規(guī)律的變化而實(shí)現(xiàn)的循環(huán)功能思杯,但是如果有一個(gè)數(shù)組想要輸出其全部的下標(biāo)和值該怎么辦?
引入:對(duì)于索引數(shù)組而言(下標(biāo)全部為數(shù)字),其實(shí)可以使用以上任意一種循環(huán)來實(shí)現(xiàn)(假設(shè)下標(biāo)從0開始即可)色乾,在循環(huán)內(nèi)部通過自增長下標(biāo)來實(shí)現(xiàn)即可誊册。但是這樣并非絕對(duì),尤其是在關(guān)聯(lián)數(shù)組下暖璧,以上循環(huán)模式的確有些乏力案怯,所以PHP額外提供了一種專門針對(duì)數(shù)組遍歷的循環(huán)方式:foreach循環(huán)
foreach循環(huán)【掌握】
定義:foreach循環(huán),是PHP中一種特定為數(shù)組設(shè)定的循環(huán)結(jié)構(gòu)澎办,能夠方便的將數(shù)組的下標(biāo)和值挨個(gè)取出來嘲碱,從而實(shí)現(xiàn)對(duì)數(shù)組的所有元素的訪問。
1.基礎(chǔ)語法
foreach(數(shù)組變量 as [存儲(chǔ)下標(biāo)的變量 =>] 存儲(chǔ)值的變量){
//訪問存儲(chǔ)下標(biāo)的變量和存儲(chǔ)值的變量
}
2.解釋
- 數(shù)組變量:即保存了數(shù)組的變量局蚀,可以是任意PHP數(shù)組(關(guān)聯(lián)麦锯、索引、混合)
- as:關(guān)鍵字琅绅,必須有
- 存儲(chǔ)下標(biāo)的變量:將數(shù)組元素對(duì)應(yīng)的某個(gè)下標(biāo)取出來扶欣,保存到該變量中,可以在循環(huán)內(nèi)部訪問
- 如果不想要下標(biāo)訪問千扶,可以省略中括號(hào)[]部分料祠,只保留存儲(chǔ)值的變量即可
- 存儲(chǔ)值的變量:將數(shù)組元素對(duì)應(yīng)的某個(gè)值(與下標(biāo)相對(duì)應(yīng)),保存到該變量中澎羞,可以在循環(huán)內(nèi)部訪問
- 最后一個(gè)元素對(duì)應(yīng)想下標(biāo)變量和值變量可以在foreach循環(huán)的外部訪問
<?php
//遍歷數(shù)組中所有的元素下標(biāo)和值
$arr = array('name' => '張三','age' => 30,'gender' => '男');
foreach($arr as $k => $v){
//$k代表取出的數(shù)組元素的下標(biāo)(變量名字可以隨便人枵馈)
//$v代表取出的數(shù)組元素的值(變量名字可以隨便取)
echo $k . ' : ' . $v . '<br/>';
}
//循環(huán)外訪問內(nèi)部變量
echo $k . ' : ' . $v . '<br/>'; //最后一個(gè)元素值:gender : 男
?>
3.foreach遍歷原理:每個(gè)PHP數(shù)組內(nèi)部有個(gè)指針煤痕,默認(rèn)指向數(shù)組元素的第一個(gè)
- foreach執(zhí)行首先判定數(shù)組指針是否有效(指向具體元素)
- 有效則取出當(dāng)前元素的下標(biāo)和值梧宫,分別賦值給對(duì)應(yīng)的下標(biāo)變量和值變量接谨;無效則循環(huán)直接終止(所以在循環(huán)外訪問數(shù)組內(nèi)部保存下標(biāo)和值的變量有風(fēng)險(xiǎn):數(shù)組沒有一個(gè)元素)
- 得到元素下標(biāo)和值后:數(shù)組指針會(huì)向后移動(dòng)一位(即指向下一個(gè)元素)
- 進(jìn)入到循環(huán)內(nèi)部
- 重新開始下一輪循環(huán)摆碉。指針在指向數(shù)組最后一個(gè)元素后,如果再向后移動(dòng)脓豪,就會(huì)指針移出數(shù)組巷帝,從而在下一輪判定數(shù)組指針是否有效時(shí),返回?zé)o效結(jié)果扫夜。
4.二維數(shù)組遍歷:按照前面所學(xué)楞泼,二維數(shù)組通常是第一維為索引(下標(biāo)為數(shù)字),第二維為關(guān)聯(lián)(下標(biāo)為字母)笤闯,所以在遍歷的時(shí)候堕阔,通常只需要進(jìn)行一層foreach即可:即遍歷出第一維,然后第二維可以通過下標(biāo)訪問颗味。
<?php
//遍歷二維數(shù)組
$info = array(
array('name' => '張三','age' => 30,'gender' => '男'),
array('name' => '王婆','age' => 75,'gender' => '女'),
array('name' => '小李','age' => 18,'gender' => '男')
); //二維數(shù)組:第一維為索引超陆,第二維為關(guān)聯(lián)
foreach($info as $p){
//第一維為索引:所以通常下標(biāo)無具體含義,因此不需要下標(biāo)
//$p就是數(shù)組$info中具體的每個(gè)元素:一個(gè)一維的關(guān)聯(lián)數(shù)組
echo '姓名:' . $p['name'] . ' 年齡:' . $p['age'] . ' 性別:' . $p['gender'] . '<br/>';
}
?>
5.練習(xí):利用for循環(huán)浦马,增加一個(gè)擁有10個(gè)數(shù)組元素的二維數(shù)組:第二維對(duì)應(yīng)的信息是stu_no(學(xué)號(hào))时呀,stu_age(年齡)张漂,stu_name(名字),stu_major(專業(yè))谨娜,對(duì)應(yīng)的值是:學(xué)號(hào)(no+順序數(shù)值)航攒,年齡(18+順序數(shù)值),名字(name+順序數(shù)值)趴梢,專業(yè)(major+順序數(shù)值)漠畜;然后再利用二維數(shù)組,輸出所有學(xué)生的信息坞靶。
總結(jié):foreach循環(huán)的目標(biāo)很明確盆驹,就是針對(duì)數(shù)組元素的遍歷,能夠方便程序員在遍歷的時(shí)候得到數(shù)組元素的下標(biāo)和值滩愁。如果二維數(shù)組本身都是索引或者關(guān)聯(lián)躯喇,而且需要所有元素的下標(biāo)和值,那么進(jìn)行兩層循環(huán)即可硝枉。
思考:循環(huán)一旦指定了外部條件就會(huì)自動(dòng)運(yùn)行廉丽,不需要任何管理控制,但是如果在循環(huán)內(nèi)部某些業(yè)務(wù)需求需要對(duì)循環(huán)做出一些調(diào)整的話有沒有什么辦法呢妻味?
引入:通常情況下正压,循環(huán)都是在外部就可以控制好的,這是循環(huán)的本質(zhì)责球。但是的確會(huì)有那種需要在循環(huán)內(nèi)部對(duì)循環(huán)進(jìn)行一些控制的時(shí)候焦履,這個(gè)時(shí)候就需要用到循環(huán)控制。
循環(huán)控制【掌握】
定義:循環(huán)控制雏逾,即在循環(huán)進(jìn)行之后嘉裤,在循環(huán)內(nèi)部(循環(huán)體)使用特定的語法來選擇讓循環(huán)按照某種特定的方式去執(zhí)行或者終結(jié)執(zhí)行。
1.循環(huán)控制分類:循環(huán)控制分為continue和break
- continue:表示從continue以后的循環(huán)體本次不再執(zhí)行栖博,重新開始下次循環(huán)
<?php
//求和:1到100之間所有的基數(shù)和
for($i = 1,$res = 0;$i <= 100;$i++){ //此處初始化條件定義了兩個(gè)值
//判斷:$i是否是基數(shù)
if($i % 2 == 0){
//模運(yùn)算:如果結(jié)果為true:說明$i是2的倍數(shù)屑宠,即偶數(shù)
continue; //代碼不再繼續(xù):重新開始下一次循環(huán):即$i++
}
//滿足條件:基數(shù)累加到結(jié)果
$res += $i;
}
?>
- break:表示直接結(jié)束循環(huán)
<?php
//求出立方數(shù)大于10000的最小整數(shù):N ^ 3 > 1000
$i = 1; //從1開始算
$min = 0; //設(shè)定初始值用來保存最終目標(biāo)值
//使用while循環(huán):因?yàn)椴磺宄h(huán)多少次
while(true){ //條件不限定:不清楚
//計(jì)算判定
if($i * $i * $i < 10000){
//變更條件
$i++;
continue; //循環(huán)重新開始
}
//能夠執(zhí)行到這的:說明$i * $i * $i的值大于或者等于10000
$min = $i; //拿到想要的結(jié)果
//但是此時(shí)循環(huán)無法終止:會(huì)一直運(yùn)行,因?yàn)閣hile條件是永遠(yuǎn)為true仇让,所以要內(nèi)部結(jié)束
break;
}
?>
2.PHP中循環(huán)控制的特點(diǎn):在PHP中典奉,循環(huán)控制不只是能夠控制本層循環(huán),而且可以通過指定循環(huán)層次控制到其他循環(huán)丧叽。具體特點(diǎn)就是在continue/break后跟上指定要控制的循環(huán)層數(shù)卫玖,默認(rèn)是1,即本層循環(huán)(可以不寫)
<?php
//控制兩層循環(huán):求1到100的所有值相乘的結(jié)果踊淳,但是第一個(gè)乘數(shù)比第二個(gè)乘數(shù)大
for($i = 1;$i < 100;$i++){
//外層循環(huán)
for($j = 1;$j < 100;$j++){
//$i是第一個(gè)乘數(shù)假瞬,$j是第二個(gè)乘數(shù):判斷
if($j > $i){
//第二個(gè)乘數(shù)大于第一個(gè)乘數(shù):內(nèi)存循環(huán)所有都沒有意義了
//continue; //如果使用continue,表示當(dāng)前內(nèi)存循環(huán)繼續(xù)執(zhí)行,即改變$j笨触,沒有價(jià)值
continue 2; //表示:當(dāng)前循環(huán)的外層重新執(zhí)行:即改變$i
}
//輸出
echo $i . ' * ' . $j . ' = ' . $i * $j; //輸出 1 * 1 = 1
}
}
?>
3.練習(xí):1懦傍,用你認(rèn)為最優(yōu)化的方式,制作一個(gè)保存100個(gè)斐波那契數(shù)列數(shù)組芦劣。斐波那契數(shù)列:第一個(gè)和第二個(gè)數(shù)為1粗俱,后面的數(shù)字都為前兩個(gè)數(shù)字之后:如1,1,2,3,5...;2虚吟,求出100以內(nèi)的所有質(zhì)數(shù)寸认。質(zhì)數(shù):只能被自己和1整除
總結(jié):循環(huán)控制是在循環(huán)實(shí)現(xiàn)基礎(chǔ)上增加的一種內(nèi)部控制機(jī)制,目的就是為了更好的適應(yīng)業(yè)務(wù)需求串慰,方便程序員在循環(huán)中去控制循環(huán)正確的執(zhí)行偏塞。
思考:數(shù)據(jù)的展示最終是給用戶看的,而用戶看到的結(jié)果一定是在HTML中顯示的邦鲫,言外之意灸叼,PHP要將用戶需要的數(shù)據(jù)在HTML中展示出來。那么PHP到底是如何跟HTML結(jié)合的呢庆捺?
引入:PHP本身是一種可以嵌入到HTML中顯示的腳本語言古今,所以PHP只需要在HTML中獲取到數(shù)據(jù),并且將數(shù)據(jù)在HTML對(duì)應(yīng)的結(jié)構(gòu)中顯示出來即可滔以。PHP中在HTML中要顯示的數(shù)據(jù)最常見的數(shù)組數(shù)據(jù)捉腥,批量顯示,所以會(huì)需要用到PHP代碼和HTML中常用的表格(table)來進(jìn)行綜合數(shù)據(jù)展示你画。在進(jìn)行數(shù)據(jù)展示過程中抵碟,有兩種方式:第一種是PHP中直接輸出對(duì)應(yīng)的table標(biāo)簽字符串,第二種是PHP代碼與table標(biāo)簽嵌套坏匪,但是分開工作(建議)拟逮。為了方便顯示和維護(hù),PHP提供了一套類似HTML標(biāo)簽的標(biāo)簽語法剥槐。
PHP標(biāo)簽語法
定義:PHP標(biāo)簽語法唱歧,是PHP為了更好的方便前端人員和后端人員分開維護(hù)共同的代碼而設(shè)計(jì)的類似HTML中的標(biāo)簽方式的語法宪摧。PHP中的標(biāo)簽語法不多粒竖,支持的標(biāo)簽語法有if和各種循環(huán)。
1.PHP嵌入到HTML中實(shí)現(xiàn)數(shù)據(jù)顯示
<?php
//在PHP中定義獲取一個(gè)數(shù)組
$info = array(
array('name' => '張三','age' => 30,'gender' => '男'),
array('name' => '王婆','age' => 75,'gender' => '女'),
array('name' => '小李','age' => 18,'gender' => '男')
);
?>
<!--在HTML中顯示數(shù)據(jù)-->
<html>
<head></head>
<body>
<table>
<th>
<td>序號(hào)</td>
<td>姓名</td>
<td>年齡</td>
<td>性別</td>
</th>
<!--PHP數(shù)組中每一個(gè)元素對(duì)應(yīng)的就是table標(biāo)簽的一整行几于,所有有多少個(gè)元素就會(huì)產(chǎn)生多少行蕊苗,因此只要針對(duì)元素遍歷即可-->
<?php foreach($info as $k => $p){?>
<!--注意:此處將foreach的{}分開到兩個(gè)PHP語句塊中:是為了中間方便嵌入HTML代碼-->
<tr>
<td><?php echo $k + 1;?></td><!--注意:二維數(shù)組的第一維索引是從0開始,所以在顯示的時(shí)候沿彭,通常+1操作-->
<td><?php echo $p['name'];?></td>
<td><?php echo $p['age'];?></td>
<td><?php echo $p['gender'];?></td>
</tr>
<?php }?>
</table>
</body>
</html>
2.HTML中嵌入的PHP代碼解析原理:PHP在HTML中嵌入的時(shí)候朽砰,通常都是多塊PHP代碼分散到HTML中,而且很多時(shí)候都是循環(huán)出現(xiàn)。其解析原理其實(shí)與原來一樣:
- 檢測到PHP代碼:確定PHP代碼塊是否本身是完整執(zhí)行的
- 如果是完整獨(dú)立的:執(zhí)行完繼續(xù)后面解析
- 如果不是獨(dú)立完整的:執(zhí)行后先留存瞧柔,往后解析漆弄,直到找到對(duì)應(yīng)的結(jié)束位置
- 如果碰到HTML代碼:直接保留到對(duì)應(yīng)位置,不做任何處理
- HTML是嵌入到PHP循環(huán)當(dāng)中:那么把這段代碼加入到循環(huán)內(nèi)部造锅,只是不做解析撼唾,按照循環(huán)次數(shù)保留對(duì)應(yīng)的次數(shù)
3.以上方式在顯示的時(shí)候有些別求,尤其是{}拆開哥蔚,而且如果在有多個(gè){}嵌入的時(shí)候(比如說判定)倒谷,那么就會(huì)顯得非常凌亂,因此PHP中可以將if糙箍,for渤愁,while和foreach使用標(biāo)簽語法來顯示,避免出現(xiàn)PHP對(duì)應(yīng)的{}
- if:原方式是if(){}深夯,標(biāo)簽語法編程if():和endif;
- for:原方式是for(){}抖格,標(biāo)簽語法為for():和endfor;
- while:原方式是while(){},標(biāo)簽語法為while():和endwhile;
- foreach:原方式是foreach(){}咕晋,標(biāo)簽語法為foreach():和endforeach;
<?php
//在PHP中定義獲取一個(gè)數(shù)組
$info = array(
array('name' => '張三','age' => 30,'gender' => '男'),
array('name' => '王婆','age' => 75,'gender' => '女'),
array('name' => '小李','age' => 18,'gender' => '男')
);
?>
<!--在HTML中顯示數(shù)據(jù)-->
<html>
<head></head>
<body>
<table>
<th>
<td>序號(hào)</td>
<td>姓名</td>
<td>年齡</td>
<td>性別</td>
</th>
<?php foreach($info as $k => $p):?>
<tr>
<td><?php echo $k + 1;?></td>
<td><?php echo $p['name'];?></td>
<td><?php echo $p['age'];?></td>
<td><?php echo $p['gender'];?></td>
</tr>
<?php endforeach;?>
</table>
</body>
</html>
4.練習(xí):使用兩種方式在表格中輸出九九乘法表他挎,table的border為1。方案1:所有的HTML代碼都是通過PHP的字符串輸出形式存在捡需,如echo '<tr>'办桨;所有的HTML代碼都與PHP分離,PHP只負(fù)責(zé)顯示數(shù)據(jù)站辉。
總結(jié):標(biāo)簽語法看似不起眼呢撞,因?yàn)楸旧頉]有額外的區(qū)別,只是為了解決{}的問題饰剥。但是在實(shí)際開發(fā)中殊霞,通常數(shù)據(jù)顯示的時(shí)候會(huì)存在邏輯判定if,會(huì)導(dǎo)致會(huì)有很多個(gè){}分開汰蓉,如果在層次不清晰的情況下绷蹲,會(huì)看起來非常啊頭疼,不好管理顾孽。所以標(biāo)簽語法能夠解決人眼清晰的問題祝钢。