3.PHP流程控制

思考:平常針對(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)簽語法能夠解決人眼清晰的問題祝钢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市若厚,隨后出現(xiàn)的幾起案子拦英,更是在濱河造成了極大的恐慌,老刑警劉巖测秸,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疤估,死亡現(xiàn)場離奇詭異灾常,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铃拇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門钞瀑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慷荔,你說我怎么就攤上這事仔戈。” “怎么了拧廊?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵监徘,是天一觀的道長。 經(jīng)常有香客問我吧碾,道長凰盔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任倦春,我火速辦了婚禮户敬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘睁本。我一直安慰自己尿庐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布呢堰。 她就那樣靜靜地躺著抄瑟,像睡著了一般枉疼。 火紅的嫁衣襯著肌膚如雪骂维。 梳的紋絲不亂的頭發(fā)上惹资,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音航闺,去河邊找鬼潦刃。 笑死侮措,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的福铅。 我是一名探鬼主播萝毛,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼笆包,長吁一口氣:“原來是場噩夢啊……” “哼略荡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巴粪,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤粥谬,失蹤者是張志新(化名)和其女友劉穎漏策,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芭届,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡感耙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年即硼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题诵。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡性锭,死狀恐怖叫胖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怎棱,我是刑警寧澤绷跑,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布砸捏,位于F島的核電站隙赁,受9級(jí)特大地震影響梆暖,放射性物質(zhì)發(fā)生泄漏轰驳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一冒黑、第九天 我趴在偏房一處隱蔽的房頂上張望勤哗。 院中可真熱鬧,春花似錦豁延、人聲如沸腊状。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苟鸯。三九已至棚点,卻和暖如春瘫析,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咸包。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工杖虾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奇适,地道東北人芦鳍。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓怜校,卻偏偏與公主長得像注竿,于是被迫代替她去往敵國和親魂贬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 任何 PHP 腳本都是由一系列語句構(gòu)成的。一條語句可以是一個(gè)賦值語句闻丑,一個(gè)函數(shù)調(diào)用勋颖,一個(gè)循環(huán),甚至一個(gè)什么也不做的...
    dptms閱讀 1,041評(píng)論 0 3
  • 一侥祭、數(shù)據(jù)類型 在PHP中茄厘,支持8種原始類型次哈,其中包括四種標(biāo)量類型、兩種復(fù)合類型和兩種特殊類型琼牧。PHP是一門松散類型...
    大嘴蝸牛閱讀 934評(píng)論 4 5
  • 53.計(jì)算字符 在字符串中獲取字符值的數(shù)量, 可以使用字符串字符屬性中的計(jì)數(shù)屬性: let unusualMena...
    無灃閱讀 1,070評(píng)論 0 4
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔障陶,今天18年5月份再次想寫文章聊训,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,732評(píng)論 2 9
  • 你是二月的春風(fēng) 沐浴著陽光帶著燦爛的笑容 你是仲夏的星空 星星下面多想與你談笑風(fēng)生 ...
    青年追夢者閱讀 177評(píng)論 0 0