# 流程控制
## 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;
```