# 流程控制
## 1. 分支結構
| 序號 | 類型 | 語法 | 模板語法 |
| ---- | -------- | ----------------------------------- | ---------------------------------------- |
| 1 | 單分支 | `if(){...}` | `if(): ... endif;` |
| 2 | 雙分支 | `if(){...} else {...}` | `if(): ... else: ... endif;` |
| 3 | 多分支 | `if(){...} elseif {...} else {...}` | `if(): ... elseif: ... else: ... endif;` |
| 4 | `switch` | `switch() {case: ... break...}` | `switch(): ...endswitch;` |
示例代碼: `demo19.php`
```php
# 分支結構
// 購買金額
$amount = 5500;
// 實際支付
$payment = $amount;
// 單分支
if ($amount > 5000) {
$payment = $amount * 0.9;
}
// 模板語法
if ($amount) :
$payment = $amount * 0.9;
endif;
echo '實際支付: ' . $payment . '<br>';
echo '<hr>';
// 雙分支
$amount = 3500;
if ($amount > 5000) {
$payment = $amount * 0.9;
} else {
$payment = $amount;
}
// 模板語法
if ($amount > 5000) :
$payment = $amount * 0.9;
else :
$payment = $amount;
endif;
echo '實際支付: ' . $payment . '<br>';
echo '<hr>';
// 多分支
$amount = 13500;
if ($amount > 5000 && $amount < 10000) {
$payment = $amount * 0.9;
} elseif ($amount >= 10000 && $amount < 20000) {
$payment = $amount * 0.7;
} elseif ($amount >= 20000 && $amount < 30000) {
$payment = $amount * 0.5;
} else {
$payment = $amount;
}
// 模板語法
if ($amount > 5000 && $amount < 10000) :
$payment = $amount * 0.9;
elseif ($amount >= 10000 && $amount < 20000) :
$payment = $amount * 0.7;
elseif ($amount >= 20000 && $amount < 30000) :
$payment = $amount * 0.5;
else :
$payment = $amount;
endif;
echo '實際支付: ' . $payment . '<br>';
echo '<hr>';
// switch分支
$amount = 23500;
switch (true) {
case $amount > 5000 && $amount < 10000:
$payment = $amount * 0.9;
break;
case $amount >= 10000 && $amount < 20000:
$payment = $amount * 0.7;
break;
case $amount >= 20000 && $amount < 30000:
$payment = $amount * 0.5;
break;
default:
$payment = $amount;
}
// 模板語法
$amount = 8500;
switch (true):
case $amount > 5000 && $amount < 10000:
$payment = $amount * 0.9;
break;
case $amount >= 10000 && $amount < 20000:
$payment = $amount * 0.7;
break;
case $amount >= 20000 && $amount < 30000:
$payment = $amount * 0.5;
break;
default:
$payment = $amount;
endswitch;
echo '實際支付: ' . $payment . '<br>';
// switch最常用的場景是單值判斷
// 例如,根據不同折扣輸出不同金額
$discount = 0.8;
switch ($discount):
case 0.9:
$payment = $amount * $discount;
break;
case 0.7:
$payment = $amount * 0.7;
break;
case 0.5:
$payment = $amount * 0.5;
break;
default:
die('不支持的折扣率');
endswitch;
echo '實際支付: ' . $payment . ', 折扣率: ' . $discount;
```
---
## 2. 循環結構
| 序號 | 類型 | 語法 | 模板語法 |
| ---- | ---------- | ------------------- | ------------------------ |
| 1 | 入口判斷型 | `while(){...}` | `while(): ... endwhile;` |
| 2 | 出口判斷型 | `do {...} while();` | `do : ... while();` |
| 3 | 計數型 | `for(){...}` | `for () : ... endfor;` |
循環控制關鍵字:
| 序號 | 關鍵字 | 描述 |
| ---- | ---------- | --------------------------- |
| 1 | `continue` | 終止本次循環,提前進入下一輪 |
| 2 | `break` | 跳出本層循環 |
示例代碼: `demo20.php`
```php
<?php
# 循環結構
$cities = ['武漢', '合肥', '南京', '杭州', '上海'];
// 1. 入口判斷型
// 只要循環條件為真,則循環執行
// current(): 獲取當前數組元素的值, next():移動數組指針指向下一條記錄
while ($city = current($cities)) {
echo $city . '<br>';
// 更新循環條件: 讀到下一個數據
next($cities);
}
// 數組指針復位,指向第一個元素
reset($cities);
// 模板語法
while ($city = current($cities)) :
echo $city . '<br>';
// 更新循環條件: 讀到下一個數據
next($cities);
endwhile;
echo '<hr>';
// 2. 出口判斷型
reset($cities);
// 只要循環條件為真,則循環執行
do {
echo $city . '<br>';
// 更新循環條件: 讀到下一個數據
next($cities);
} while ($city = current($cities));
// 你會發現,第一個城市"武漢"消失了,為什么呢?
// 因為出口判斷型,無論條件是否滿足,循環體總會先執行一遍,next($cities)跳過了第一個元素
// do-while 沒有對應的模板語法
echo '<hr>';
// 3. 計數型
reset($cities);
// for()循環是while()的聚合版,將循環條件與條件更新全部集成到了參數中
// count(): 獲到數組元素數量
for ($i = 0; $i < count($cities); $i++) {
echo $cities[$i] . '<br>';
}
// 模板語法
reset($cities);
for ($i = 0; $i < count($cities); $i++) :
echo $cities[$i] . '<br>';
endfor;
echo '<hr>';
// 關鍵字continue: 終止本次循環,提前進入下一輪
// 關鍵字break: 跳出本層循環
$cities = ['武漢', '合肥', false, '南京', null, '杭州', '上海'];
// 其實用while()遍歷數組時是有一個bug的,如果數組存在計算結果為false的元素會提前結束循環
while ($city = current($cities)) :
echo $city . '<br>';
next($cities);
endwhile;
// continue: 跳過運算結果為false數據
reset($cities);
// 因為while()條件為false時, 不會執行,所以換成for
for ($i = 0; $i < count($cities); $i++) :
if (!$cities[$i]) continue;
echo $cities[$i] . '<br>';
// 如果值為"杭州"跳出循環
if ($cities[$i] === '杭州') break;
endfor;
```