PHP之流程控制

1. PHP流程控制

1.1 流程控制

定义:所谓流程控制,就是在代码逻辑中增加一些“开关”,让代码可以按照正常的业务需求运行到最后。

  1. 在PHP中,流程控制分为三种:
  • 顺序结构: 是最普遍的一种结构,不需要人为控制,就是代码按照编写的顺序从上往下逐行执行
<?php
//定义变量
$a = 250;        //PHP解释器先解释第一行代码
//输出结果    
echo $a;         //PHP解释器顺序执行第二行代码
?>
  • 分支结构: 需要人为控制,将可能发生的结果对应的代码块,按照指定的条件去判断执行,通常情况下是根据条件选择一个对应的代码块执行
  • 循环结构 : 是代码高效解决重复问题的一种方式,通常是设定变化条件,然后让代码块在指定范围内重复执行

2. 分支结构

定义:IF是如果的意思,言外之意是如果某种条件达到,再去执行某一件事。IF分支就是根据条件来分出不同的“支流”,每个支流有对应的解决方案。if中所有条件需求的结果都是使用布尔类型,如果提供的是非布尔类型,那么系统会自动转换成布尔结果

2.1 IF分支结构

  1. if分支根据业务的复杂性可以分为三种:
  • 简单if分支: 简单的if分支是只有一个代码块,达到某个指定的条件才会执行,否则不执行对应的代码块
# 简单if分支:语法规则
if(条件){
  // 满足条件要执行的代码块
}

例子:

<?php
$a = 1;
if ($a == 1){      // 返回True
    echo '$a = 1'; // 输出 $a = 1
}
?>
  • 标准if分支: 通常是要解决条件的满足于不满足情况,满足条件时对应的代码块会执行,不满足条件时对应的另外一个代码块会执行:言外之意两个代码块一定执行其中一个(只有一个)
# 标准if分支:语法规则
if(条件){
  // 满足条件要执行的代码块
}else{
  // 不满足条件要执行的代码块
}

例子:

<?php
$a = 1;
if($a == 1){
    echo '$a = 1';
}else{
    echo "$a = ?";
}
?>
  • 复杂if分支 : 这种通常是条件对应的结果通常会大于两个,不是非黑即白。因此在进行一轮条件匹配后,还要进行第二轮甚至更多轮的条件匹配
# 复杂if分支:语法规则

if(条件1){   
    // 满足条件1要执行的代码块
}elseif(条件2){
  // 满足条件2要执行的代码块
... //表示可以有任意多个条件
}else{
  // 不满足全部条件要执行的代码块
}

例子:

<?php
$Name = "Taoy";
if($Name == "xiaohong"){
    echo "你是小红!";
}elseif($Name == "xiaoming"){
    echo "你是小明!";
}else{
    echo "我不认识你!";
}

?>

2.2 Switch 分支循环

定义:Switch也是一种通过条件匹配来选择执行代码块的分支结构,但是Switch的条件只有一个(只需要写一次),而且运行机制与if分支结构不一样。

# Switch 基本语法
switch(条件变量){
  case 匹配值1:
    //满足条件执行的代码块;
    break; //结束分支结构
  case 匹配值2:
    //满足条件执行的代码块;
    break;   ...
  default:
    //条件都不匹配执行的代码块;
    break;
}

例子:

<?php
$Name = "Taoy";

switch($Name){
    case "Taoy":
        echo "Your name is Taoy.";
        break;
    case "xiaoming":
        echo "Your name is xiaoming";
        break;
    default:
        echo "I don't know!";
        break;
}

# 输出结果: Your name is Taoy.
?>

当没有一个被匹配的时候,则会执行default里的语句,例子:

<?php
$Name = "Tao";

switch($Name){
    case "Taoy":
        echo "Your name is Taoy.";
        break;
    case "xiaoming":
        echo "Your name is xiaoming";
        break;
    default:
        echo "I don't know!";
        break;
}

# 输出结果: I don't know!
?>

switch分支与if分支的区别

  • switch分支的条件与if分支不同,if分支比较灵活,可以是变量也可以是运算表达式,而switch只能是变量(而且变量通常是连续的数据)
  • if分支的条件是从第一个开始挨个匹配,而switch的逻辑不一样,不需要挨个匹配,是直接到达目标case(因此如果是对于多条件而言,使用switch比if实现效率要高一些;如果是简单匹配if效率高)
  • if分支匹配,永远最多执行一个代码块(匹配成功的),而switch如果在不使用break的情况下,可以执行多个条件对应的代码块

3. 循环结构

3.1 for循环

# for循环 基础语法
for(初始化条件;条件判定;条件变更)
{
  //要重复执行的代码(循环体)
}
  • 初始化条件:循环进入的开始条件,如果有需求也可以在此定义多个条件,使用逗号分隔(通常是设定变量初始值和边界值),是for循环执行的第一段代码(只执行一次)
  • 条件判定:是进入循环内部执行循环体的门槛,在此判断条件是否符合(通常是一个比较表达式),符合就进入循环内部(循环体),不符合就直接结束循环,是for循环执行的第二段代码(循环执行)
  • 循环体:要重复执行的代码块,是for循环执行的第三段代码(循环执行)
  • 条件变更:是在循环结束后,对循环条件的变化语句(通常是自变量,自增++或者自减--),是for循环执行的第四段代码(循环执行)
  • 循环执行:就是代码从初始化条件后,不断的重复执行条件判定循环体条件变更的过程,直到条件判定结束
  • 循环控制的条件变量(条件变更,通常也就是初始化条件)在循环执行结束后是可以在外部使用的,其代表的数据就是条件判定不满足的第一个值
<?php
//输出1-100之间的整数
//分析:初始条件应该是从1开始,结束条件应该是数据大于100,条件的变化每次是1(整数)
for($i = 1;$i <= 100;$i++){
    echo $i,' ';                   //echo后可以使用逗号分隔输出多个内容
    //初始化条件:   $i = 1         //只执行一次:第一次
    //条件判定:     $i <= 100      //执行101次,$i最后一次为101
    //循环体:       echo $i,' '    //执行100次
    //条件变更:     $i++           //$i每次在原来基础上+1(执行100次)   
}

//循环后使用条件变量
echo $i;                           //101,第一个大于边界值100的数据
?>

2.特殊情况下使用for条件:for循环的条件并非一定需要,如果本身在循环内部(循环体)就可以控制循环的执行(不要成为死循环),for循环中的初始化条件、条件判定和条件变更可以都不需要

<?php
//无条件for循环:极端使用,初始化条件、条件判定和条件变更都没有
for(;;){
    //没有任何循环条件
    //循环体
    //一定要有循环控制(后学),要不然就是死循环(导致内存崩溃)
}
?>

写一个程序,打印 1-100 之间的偶数

<?php

for ($i = 1; $i <= 100; $i++){
    if ($i % 2 == 0){
        echo $i.'<br />';
    }
}

# 输出结果: 2 4 6 8 10 ...
?>

3.2 while 循环

# 基础语法
while(循环条件)
{
//循环体
}

while循环通常是在循环外部定义循环条件(条件变量),然后在循环体中执行循环条件的变化

例子(输出 1- 100):

<?php
//输出1到100的整数
$i = 1;            //定义初始化变量
while($i <= 100){
    //循环体
    echo $i.'<br />';       //如果到这结束:那么循环就进入死循环,因为$i永远为1,从而小于等于100
    //变更循环条件
    $i++;          //在循环体中控制循环变量   
}
?>

while循环与for循环的区别:二者没有本质区别,都可以实现各种循环。区别在于形式上:for循环是将条件与循环体控制在for循环自己内部,而while循环通常需要在外部定义循环条件,同时如果是需要手动条件变更,则需要在循环体中出现

3.3 do-while 循环

# 基础语法
do{
//循环体
}while(条件); //注意:因为do-while不是花括号结束,所以需要使用语句结束符

do后跟循环体,表示循环一开始先执行循环体,后判定while中的条件:条件符合继续执行循环体;条件不符合结束循环

<?php
//求100以内的基数和
$i = 1;
$res = 0;            //定义先决条件

do{
    $res += $i;      //累计求和
    $i++;            //条件变更
}while($i <= 100);   //条件判定
?>

do-while与while的区别:do-while和while都是执行循环,区别在于while是先判定条件,而do-while是先执行循环体。言外之意,while有可能循环体一次都不执行,而do-while一定会执行至少一次

3.4 foreach 循环

# 基础语法
foreach(数组变量 as [存储下标的变量 =>] 存储值的变量){
  //访问存储下标的变量和存储值的变量
}
  • 数组变量:即保存了数组的变量,可以是任意PHP数组(关联、索引、混合)
  • as:关键字,必须有
  • 存储下标的变量:将数组元素对应的某个下标取出来,保存到该变量中,可以在循环内部访问
  • 如果不想要下标访问,可以省略中括号[]部分,只保留存储值的变量即可
  • 存储值的变量:将数组元素对应的某个值(与下标相对应),保存到该变量中,可以在循环内部访问
  • 最后一个元素对应想下标变量和值变量可以在foreach循环的外部访问
<?php
//遍历数组中所有的元素下标和值
$arr = array('name' => 'Taoy','age' => 19,'gender' => '男');

foreach($arr as $k => $v){
    //$k代表取出的数组元素的下标(变量名字可以随便取)
    //$v代表取出的数组元素的值(变量名字可以随便取)
    echo $k . ' : ' . $v . '<br/>';
}
//循环外访问内部变量
echo $k . ' : ' . $v . '<br/>';        //最后一个元素值:gender : 男

?>

上面代码程序输出:

name : Taoy
age : 19
gender : 男
gender : 男

foreach遍历原理:每个PHP数组内部有个指针,默认指向数组元素的第一个

  • foreach执行首先判定数组指针是否有效(指向具体元素)
  • 有效则取出当前元素的下标和值,分别赋值给对应的下标变量和值变量;无效则循环直接终止(所以在循环外访问数组内部保存下标和值的变量有风险:数组没有一个元素)
  • 得到元素下标和值后:数组指针会向后移动一位(即指向下一个元素)
  • 进入到循环内部
  • 重新开始下一轮循环。指针在指向数组最后一个元素后,如果再向后移动,就会指针移出数组,从而在下一轮判定数组指针是否有效时,返回无效结果。

2.二维数组遍历

二维数组通常是第一维为索引(下标为数字),第二维为关联(下标为字母),所以在遍历的时候,通常只需要进行一层foreach即可:即遍历出第一维,然后第二维可以通过下标访问

<?php
//遍历二维数组
$info = array(
    array('name' => 'Taoy','age' => 19,'gender' => '男'),
    array('name' => 'xiaoming','age' => 18,'gender' => '男'),
    array('name' => 'xiaohong','age' => 17,'gender' => '女')
    );                //二维数组:第一维为索引,第二维为关联

foreach($info as $p){
    //第一维为索引:所以通常下标无具体含义,因此不需要下标
    //$p就是数组$info中具体的每个元素:一个一维的关联数组
    echo '姓名:' . $p['name'] . ' 年龄:' . $p['age'] . ' 性别:' . $p['gender'] . '<br/>';
}
?>

上述程序输出结果:

姓名:Taoy 年龄:19 性别:男
姓名:xiaoming 年龄:18 性别:男
姓名:xiaohong 年龄:17 性别:女

3.5 循环控制

定义:循环控制,即在循环进行之后,在循环内部(循环体)使用特定的语法来选择让循环按照某种特定的方式去执行或者终结执行。

循环控制分类:

  • continue: 表示从continue以后的循环体本次不再执行,重新开始下次循环
<?php
//求和:1到100之间所有的奇数和
for($i = 1,$res = 0;$i <= 100;$i++){    //此处初始化条件定义了两个值
    //判断:$i是否是奇数
    if($i % 2 == 0){
        //模运算:如果结果为true:说明$i是2的倍数,即偶数
        continue;    //代码不再继续:重新开始下一次循环:即$i++
    }
    //满足条件:奇数累加到结果
    $res += $i;
}
echo $res   // 输出 2500
?>
  • break: 表示直接结束循环
<?php
$a = 1;
while ($a <= 20){
    if ($a == 10){  // 1 - 20之间循环,当$a = 10 时候 结束循环,此时$a = 10
        break;
    }
    $a++;
}
echo $a; // 输出 10

?>

本文链接:

https://www.betao.cn/archives/phpreview02.html
1 + 9 =
快来做第一个评论的人吧~