今天就是PHP基礎知識的最後兩篇文章,目的很簡單就是讓大家對PHP有個初步的認識,這篇主要說下PHP迴圈,它用於執行相同的代碼塊指定的次數。為我們的開發節省時間。
迴圈
在您編寫代碼時,您經常需要讓相同的代碼塊運行很多次。您可以在代碼中使用迴圈語句來完成這個任務。
在 PHP 中,我們可以使用下列迴圈語句:
while
只要指定的條件成立,則迴圈執行代碼塊
do…while
首先執行一次代碼塊,然後在指定的條件成立時重複這個迴圈
for
迴圈執行代碼塊指定的次數
foreach
根據數組中每個元素來迴圈代碼塊
while 語句
只要指定的條件成立,while 語句將重複執行代碼塊。
文法
while (condition)
code to be executed;
例子
下面的例子示範了一個迴圈,只要變數 i 小於或等於 5,代碼就會一直迴圈執行下去。迴圈每迴圈一次,變數就會遞增 1:
| 代碼如下 |
複製代碼 |
<html> <body> <?php $i=1; while($i<=5) { echo "The number is " . $i . "<br />"; $i++; } ?> </body> </html> |
do…while 語句
do…while 語句會至少執行一次代碼 – 然後,只要條件成立,就會重複進行迴圈。
文法
do
{
code to be executed;
}
while (condition);
例子
下面的例子將對 i 的值進行一次累加,然後,只要 i 小於 5 的條件成立,就會繼續累加下去:
| 代碼如下 |
複製代碼 |
<html> <body> <?php $i=0; do { $i++; echo "The number is " . $i . "<br />"; } while ($i<5); ?> </body> </html> |
for 語句
如果您已經確定了代碼塊的重複執行次數,則可以使用 for 語句。
文法
for (initialization; condition; increment)
{
code to be executed;
4 }
注釋:for 語句有三個參數。第一個參數初始設定變數,第二個參數儲存條件,第三個參數包含執行迴圈所需的增量。如果 initialization 或 increment 參數中包括了多個變數,需要用逗號進行分隔。而條件必須計算為 true 或者 false。
例子
下面的例子會把文本 “Hello World!” 顯示 5 次:
| 代碼如下 |
複製代碼 |
<html> <body> <?php for ($i=1; $i<=5; $i++) { echo "Hello World!<br />"; } ?> </body> </html> |
foreach 語句
foreach 語句用於迴圈遍曆數組。
每進行一次迴圈,當前數組元素的值就會被賦值給 value 變數(數組指標會逐一地移動) – 以此類推。
文法
foreach (array as value)
{
code to be executed;
}
例子
下面的例子示範了一個迴圈,這個迴圈可以輸出給定數組的值:
| 代碼如下 |
複製代碼 |
<html> <body> <?php $arr=array("one", "two", "three"); foreach ($arr as $value) { echo "Value: " . $value . "<br />"; } ?> </body> </html> |
一個遍曆目錄函式
| 代碼如下 |
複製代碼 |
<?php /* * 遞迴擷取指定路徑下的所有檔案或匹配指定正則的檔案(不包括“.”和“..”),結果以數組形式返回 * @param string $dir * @param string [$pattern] * @return array */ function file_list($dir,$pattern="") { $arr=array(); $dir_handle=opendir($dir); if($dir_handle) { // 這裡必須嚴格比較,因為返回的檔案名稱可能是“0” while(($file=readdir($dir_handle))!==false) { if($file==='.' || $file==='..') { continue; } $tmp=realpath($dir.'/'.$file); if(is_dir($tmp)) { $retArr=file_list($tmp,$pattern); if(!emptyempty($retArr)) { $arr[]=$retArr; } } else { if($pattern==="" || preg_match($pattern,$tmp)) { $arr[]=$tmp; } } } closedir($dir_handle); } return $arr; } // 列出網站根目錄下所有以".php"副檔名(不區分大小寫)結尾的檔案 echo '<pre>'; print_r(file_list($_SERVER['DOCUMENT_ROOT'],"//.php$/i")); echo '</pre>'; ?>
|
這個就可以方便的無限目錄遍曆了。.
foreach與while效能比較
在迴圈裡進行的是數組“讀”操作,則foreach比while快:
在迴圈裡進行的是數組“寫”操作,則while比foreach快
| 代碼如下 |
複製代碼 |
/** * while跟foreach函數效能比較 * */ // foreach 函數 foreach ($array as $key => $value) { echo $array[$key] = $value . '...'; } // while 函數 while (list($key) = each($array)) { $array[$key] = $array[$key] . '...'; } |
總結:通常認為,foreach涉及到值複製,一定會比while慢,但實際上,如果僅僅是在迴圈裡進行數組的讀操作,那麼foreach是很
快的,這是因為PHP採用的複製機制是“引用計數,寫時複製”,也就是說,即便在PHP裡複製一個變數,最初的形式從根本上說其實
仍然是引用的形式,只有當變數的內容發生變化時,才會出現真正的複製,之所以這麼做是出於節省記憶體消耗得目的,同時也提升了
複製的效率。
這樣看來,foreach的高效讀操作就不難理解了。另外,既然foreach不適合處理數組寫操作,那麼我們可以得出一個結
論,多數情況下,類似foreach ($array as $key => $value)形式的做數組寫操作得代碼都應該被替換成while (list($key) =
each($array))。這些技巧產生的速度差異在小項目裡可能並不明顯,但是在類似架構這樣的大項目中,一次請求動輒便會涉及到幾
百幾千幾萬次數組迴圈操作,差異就會明顯放大。