PHP基礎(chǔ)之流程控制4——for/foreach
(PHP 4, PHP 5)
for?循環(huán)是 PHP 中最復(fù)雜的循環(huán)結(jié)構(gòu)。它的行為和 C 語(yǔ)言的相似。?for?循環(huán)的語(yǔ)法是:
for (expr1; expr2; expr3) statement
第一個(gè)表達(dá)式(expr1)在循環(huán)開(kāi)始前無(wú)條件求值(并執(zhí)行)一次。
expr2?在每次循環(huán)開(kāi)始前求值。如果值為?TRUE,則繼續(xù)循環(huán),執(zhí)行嵌套的循環(huán)語(yǔ)句。如果值為?FALSE,則終止循環(huán)。
expr3?在每次循環(huán)之后被求值(并執(zhí)行)。
每個(gè)表達(dá)式都可以為空或包括逗號(hào)分隔的多個(gè)表達(dá)式。表達(dá)式?expr2?中,所有用逗號(hào)分隔的表達(dá)式都會(huì)計(jì)算,但只取最后一個(gè)結(jié)果。expr2?為空意味著將無(wú)限循環(huán)下去(和 C 一樣,PHP 暗中認(rèn)為其值為?TRUE)。這可能不像想象中那樣沒(méi)有用,因?yàn)榻?jīng)常會(huì)希望用有條件的?break?語(yǔ)句來(lái)結(jié)束循環(huán)而不是用?for?的表達(dá)式真值判斷。
考慮以下的例子,它們都顯示數(shù)字 1 到 10:
<?php/*?example?1?*/for?($i?=?1;?$i?<=?10;?$i++)?{????echo?$i;}/*?example?2?*/for?($i?=?1;?;?$i++)?{????if?($i?>?10)?{????????break;????}????echo?$i;}/*?example?3?*/$i?=?1;for?(;;)?{????if?($i?>?10)?{????????break;????}????echo?$i;????$i++;}/*?example?4?*/for?($i?=?1,?$j?=?0;?$i?<=?10;?$j?+=?$i,?print?$i,?$i++);?>當(dāng)然,第一個(gè)例子看上去最簡(jiǎn)潔(或者有人認(rèn)為是第四個(gè)),但用戶可能會(huì)發(fā)現(xiàn)在?for?循環(huán)中用空的表達(dá)式在很多場(chǎng)合下會(huì)很方便。
PHP 也支持用冒號(hào)的?for?循環(huán)的替代語(yǔ)法。
for (expr1; expr2; expr3): statement; ...endfor;
有時(shí)經(jīng)常需要像下面這樣例子一樣對(duì)數(shù)組進(jìn)行遍歷:
<?php/*?*?此數(shù)組將在遍歷的過(guò)程中改變其中某些單元的值?*/$people?=?Array(????????Array(’name’?=>?’Kalle’,?’salt’?=>?856412),?????????Array(’name’?=>?’Pierre’,?’salt’?=>?215863)????????);for($i?=?0;?$i?<?sizeof($people);?++$i){????$people[$i][’salt’]?=?rand(000000,?999999);}?>以上代碼可能執(zhí)行很慢,因?yàn)槊看窝h(huán)時(shí)都要計(jì)算一遍數(shù)組的長(zhǎng)度。由于數(shù)組的長(zhǎng)度始終不變,可以用一個(gè)中間變量來(lái)儲(chǔ)存數(shù)組長(zhǎng)度以優(yōu)化而不是不停調(diào)用?count():
<?php$people?=?Array(????????Array(’name’?=>?’Kalle’,?’salt’?=>?856412),?????????Array(’name’?=>?’Pierre’,?’salt’?=>?215863)????????);for($i?=?0,?$size?=?sizeof($people);?$i?<?$size;?++$i){????$people[$i][’salt’]?=?rand(000000,?999999);}?>foreach(PHP 4, PHP 5)
foreach?語(yǔ)法結(jié)構(gòu)提供了遍歷數(shù)組的簡(jiǎn)單方式。foreach?僅能夠應(yīng)用于數(shù)組和對(duì)象,如果嘗試應(yīng)用于其他數(shù)據(jù)類(lèi)型的變量,或者未初始化的變量將發(fā)出錯(cuò)誤信息。有兩種語(yǔ)法:
foreach (array_expression as $value) statementforeach (array_expression as $key => $value) statement
第一種格式遍歷給定的?array_expression?數(shù)組。每次循環(huán)中,當(dāng)前單元的值被賦給?$value?并且數(shù)組內(nèi)部的指針向前移一步(因此下一次循環(huán)中將會(huì)得到下一個(gè)單元)。
第二種格式做同樣的事,只除了當(dāng)前單元的鍵名也會(huì)在每次循環(huán)中被賦給變量?$key。
還能夠自定義遍歷對(duì)象。
Note:
當(dāng)?foreach?開(kāi)始執(zhí)行時(shí),數(shù)組內(nèi)部的指針會(huì)自動(dòng)指向第一個(gè)單元。這意味著不需要在?foreach?循環(huán)之前調(diào)用?reset()。
由于?foreach?依賴內(nèi)部數(shù)組指針,在循環(huán)中修改其值將可能導(dǎo)致意外的行為。
可以很容易地通過(guò)在?$value?之前加上 & 來(lái)修改數(shù)組的元素。此方法將以引用賦值而不是拷貝一個(gè)值。
<?php$arr?=?array(1,?2,?3,?4);foreach?($arr?as?&$value)?{????$value?=?$value?*?2;}//?$arr?is?now?array(2,?4,?6,?8)unset($value);?//?最后取消掉引用?>$value?的引用僅在被遍歷的數(shù)組可以被引用時(shí)才可用(例如是個(gè)變量)。以下代碼則無(wú)法運(yùn)行:
<?phpforeach?(array(1,?2,?3,?4)?as?&$value)?{????$value?=?$value?*?2;}?>Warning數(shù)組最后一個(gè)元素的?$value?引用在?foreach?循環(huán)之后仍會(huì)保留。建議使用?unset()?來(lái)將其銷(xiāo)毀。Note:
foreach?不支持用“@”來(lái)抑制錯(cuò)誤信息的能力。
用戶可能注意到了以下的代碼功能完全相同:
<?php$arr?=?array('one',?'two',?'three');reset($arr);while?(list(,?$value)?=?each($arr))?{????echo?'Value:?$value<br>n';}foreach?($arr?as?$value)?{????echo?'Value:?$value<br?/>n';}?>以下代碼功能也完全相同:
<?php$arr?=?array('one',?'two',?'three');reset($arr);while?(list($key,?$value)?=?each($arr))?{????echo?'Key:?$key;?Value:?$value<br?/>n';}foreach?($arr?as?$key?=>?$value)?{????echo?'Key:?$key;?Value:?$value<br?/>n';}?>示范用法的更多例子:
<?php/*?foreach?example?1:?value?only?*/$a?=?array(1,?2,?3,?17);foreach?($a?as?$v)?{???echo?'Current?value?of?$a:?$v.n';}/*?foreach?example?2:?value?(with?its?manual?access?notation?printed?for?illustration)?*/$a?=?array(1,?2,?3,?17);$i?=?0;?/*?for?illustrative?purposes?only?*/foreach?($a?as?$v)?{????echo?'$a[$i]?=>?$v.n';????$i++;}/*?foreach?example?3:?key?and?value?*/$a?=?array(????'one'?=>?1,????'two'?=>?2,????'three'?=>?3,????'seventeen'?=>?17);foreach?($a?as?$k?=>?$v)?{????echo?'$a[$k]?=>?$v.n';}/*?foreach?example?4:?multi-dimensional?arrays?*/$a?=?array();$a[0][0]?=?'a';$a[0][1]?=?'b';$a[1][0]?=?'y';$a[1][1]?=?'z';foreach?($a?as?$v1)?{????foreach?($v1?as?$v2)?{????????echo?'$v2n';????}}/*?foreach?example?5:?dynamic?arrays?*/foreach?(array(1,?2,?3,?4,?5)?as?$v)?{????echo?'$vn';}?>用 list() 給嵌套的數(shù)組解包(PHP 5 >= 5.5.0)
PHP 5.5 增添了遍歷一個(gè)數(shù)組的數(shù)組的功能并且把嵌套的數(shù)組解包到循環(huán)變量中,只需將?list()?作為值提供。
例如:
<?php$array?=?[????[1,?2],????[3,?4],];foreach?($array?as?list($a,?$b))?{????//?$a?contains?the?first?element?of?the?nested?array,????//?and?$b?contains?the?second?element.????echo?'A:?$a;?B:?$bn';}?>以上例程會(huì)輸出:
A: 1; B: 2A: 3; B: 4
list()?中的單元可以少于嵌套數(shù)組的,此時(shí)多出來(lái)的數(shù)組單元將被忽略:
<?php$array?=?[????[1,?2],????[3,?4],];foreach?($array?as?list($a))?{????//?Note?that?there?is?no?$b?here.????echo?'$an';}?>以上例程會(huì)輸出:
13
如果?list()?中列出的單元多于嵌套數(shù)組則會(huì)發(fā)出一條消息級(jí)別的錯(cuò)誤信息:
<?php$array?=?[????[1,?2],????[3,?4],];foreach?($array?as?list($a,?$b,?$c))?{????echo?'A:?$a;?B:?$b;?C:?$cn';}?>以上例程會(huì)輸出:
Notice: Undefined offset: 2 in example.php on line 7A: 1; B: 2; C: Notice: Undefined offset: 2 in example.php on line 7A: 3; B: 4; C:
相關(guān)文章:
1. Java之JSP教程九大內(nèi)置對(duì)象詳解(中篇)2. 基于python計(jì)算滾動(dòng)方差(標(biāo)準(zhǔn)差)talib和pd.rolling函數(shù)差異詳解3. CSS自定義滾動(dòng)條樣式案例詳解4. JS繪圖Flot如何實(shí)現(xiàn)動(dòng)態(tài)可刷新曲線圖5. 詳解CSS不定寬溢出文本適配滾動(dòng)6. 基于android studio的layout的xml文件的創(chuàng)建方式7. 使用ProcessBuilder調(diào)用外部命令,并返回大量結(jié)果8. 詳解Python中openpyxl模塊基本用法9. Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求)10. springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案
