五、PHP流程控制语句
理论证明,无论多么复杂的逻辑结构,最终都可以简化为三种逻辑的组合。这三种逻辑就是顺序逻辑、选择逻辑和循环逻辑。所以在面向过程的结构化程序设计语言中,都有专门的程序语法来构成这三种结构。
顺序结构程序设计
顺序结构是最简单的程序结构,就是按照程序书写的顺序逐条语句的执行。选择结构
选择程序结构用于判断给定的条件,根据判断的结果来控制程序的流程。使用选择结构语句时,要用条件表达式来描述条件。在PHP中,经常使用的条件语句有:if…else…elseif和switch…case。下面分别对这两种条件语句进行说明。
(1)if语句
if语句的基本表达式如下所示:if(条件表达式) 语句;
在上面基本if结构中,如果条件表达式的值为True就执行语句,否则不执行语句。如果按条件执行的语句不止一条,则需要将这些语句放入语句组中,通过大括号对“{”和“}”括起来。
经常需要在满足某个条件时执行一条语句,而不满足该条件时执行其他语句,这正是else的功能。else延伸了if语句,可以在if语句中的表达式的值为False时执行语句。
如果需要同时判断多个条件,则上面的if…else语句满足不了需求,PHP提供了elseif来扩展需求(2)switch语句
switch语句和具有同样表达式的一系列的if语句相似。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。这正是switch语句的用途。例如:<?php switch (date("D")) { case "Mon": echo "今天星期一"; break; case "Tue": echo "今天星期二"; break; case "Wed": echo "今天星期三"; break; case "Thu": echo "今天星期四"; break; case "Fri": echo "今天星期五"; break; default: echo "今天放假"; break; } ?>
循环结构
循环语句用于反复执行一系列的语句,直到条件表达式保持真值。为了保证循环的正确执行,条件表达式中计算的值应该在每次执行循环语句的时候进行修改。下面分别介绍两种最常用的循环语句。(1)for循环
for循环的语法:for(表达式1;表达式2;表达式3) 循环体语句;
如果循环体语句有多条时,要用大括号括起来。在for循环中,先执行一次表达式1。然后判断表达式2的值是否为真,如果为真,则执行循环体,再执行表达式3。表达式3执行完又返回判断表达式2的值,只到表达2的值为假就结束循环。(2)while循环
while循环的语法为:while(表达式) 循环体语句;
如果循环体语句有多条时,要用大括号括起来。其执行流程是先判断表达式的值,如果为真(True)则执行循环体语句,执行完后程序流程继续开始判断表达式的值。如果为真继续执行循环体语句。如此循环执行,真到表达式的值为假(False)为至。有时候如果while表达式的值一开始就是False,则循环语句一次都不会执行。(3)foreach
foreach循环是php4中引入的,只能用于数组。在php5中,又增加了对对象的支持。foreach()有两种用法:foreach(array_name as $value) { 语句块; }
这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环会得到下一个元素。
foreach(array_name as $key => $value) { 语句块; }
这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如book[0]=1中的“0”,book[id]=”001”中的“id”。
<?php $book = array("1"=>"联想笔记本","2"=>"数码相机","3"=>"天翼3G手机","4"=>"瑞士手表"); $price = array("1"=>"4998元","2"=>"2588元","3"=>"2766元","4"=>"76698元"); $counts = array("1"=>2,"2"=>1,"3"=>2,"4"=>2); echo '<table width="580" border="1"> <tr> <td width="145" align="center">商品名称</td> <td width="145" align="center">价 格</td> <td width="145" align="center">数量</td> <td width="145" align="center">金额</td></tr>'; foreach($book as $key=>$value){ //以book数组做循环,输出键和值 echo '<tr> <td height="25" align="center">'.$value.'</td> <td align="center">'.$price[$key].'</td> <td align="center">'.$counts[$key].'</td> <td align="center">'.$counts[$key]*$price[$key].'</td></tr>'; } echo '</table>'; ?>
while循环的另外一种使用方式是do…while。do…while语句的语法为:
do 循环体语句; while(表达式)
如果循环体语句有多条时,要用大括号括起来。do…while语句的流程是先执行一循环体语句,后判断表达式的值。如果表达的值第一次就为False,do…while循环也会至少执行一次循环体语句。这是do…while循环与while循环的主要区别
PHP常用循环中,经常会遇到需要中止循环的情况。而处理方式主要用到break及continue两个流程控制指令。通过这两个语句可以增强编程的灵活性,提高编程效率,下面分别介绍这两个语句。
1.break语句
结束当前for、foreach、while、do-while、switch结构的执行。break可以接受一个可选的数字参数来决定跳出几重循环。例如:
<?php
$num = 0;
while (++$num)
{
switch ($num)
{
case 5:
echo "At 5<br />\n";
break 1; // 只跳出switch循环,1为参数.
case 10:
echo "At 10; quitting<br />\n";
break 2; // 跳出while和switch循环,2为参数.
default:
break;
}
}
?>
//结果为At 5, At 10 ;quiting
2.continue循环
continue用来跳过本次循环中剩余的代码,并在条件求值为真时开始执行下一次循环。continue还可接受一个可选的数字参数来决定跳过几重循环到循环结尾。例如:
<?php
$i=0;
while($i++<5)
{
if($i==2) //跳了,也就是不会输出 i am 2;
{
continue;
}
echo "i am $i<br>";
}
$i=0;
while($i++<5)
{
echo "外层<br>\n";
while(1)
{
echo" 中间层<br>\n";
while(1)
{
echo " 内层<br>\n";
$i=6;
continue 3;
}
//因为每次到内层的时候,就跳到第一层,不会被执行
echo "我永远不会被输出的.<br>\n";
}
echo "我也是不会被输出的.<br>\n";
}
?>
//结果为
// I am 1; I am 3; I am 4; I am 5;
//外层
// 中间层
// 内层
六、PHP字符串处理
在PHP编程中,字符串总是会被大量的生成和处理。正确地使用和处理字符串就显得越来越重要了,下面就按照功能介绍常用字符串处理函数。
获取字符串长度
获取字符串长度可通过strlen函数实现,语法格式如下:int strlen(string $str)
参数str为需要计算长度的字符串,成功则返回字符串str的长度(包括空格);
如果str为空,则返回0。去除字符串多余空格
用户在输入数据的时候,经常会无意中输入空格。而在有些情况下字符串中不允许出现空格。这个时候就需要去除字符串中的空格,在PHP中提供了以下函数去除字符串中的空格。
(1)trim()函数
trim()函数用于去除字符串开始位置以及结束位置的空格,并返回去掉空格后的字符串。语法格式如下:string trim ( string $str [, string $charlist ] )
此函数返回字符串$str去除首尾空白字符后的结果。如果不指定第二个参数,trim()函数默认将去除的字符如下:” ” (ASCII为32 (0x20)),普通空格符。
“\t” (ASCII为9 (0x09)),制表符。
“\n” (ASCII为10 (0x0A)),换行符。
“\r” (ASCII为13 (0x0D)),回车符。
“\0” (ASCII为0 (0x00)),空字节符。
“\x0B” (ASCII为11 (0x0B)),垂直制表符(2)ltrim()函数
ltrim()函数用于去除字符串左边的空格或者指定字符串。其默认去除的字符串同trim()函数一样。该函数的语法格式如下:string ltrim ( string $str [, string $charlist ] )
(3)rtrim()函数
rtrim()函数用于去除字符串右边的空格或者指定字符串。用法同trim()和ltrim()函数一样。该函数的语法格式如下:string rtrim ( string $str [, string $charlist ] )
字符串的联接和分割
很多时候,需要将一个包含很多信息的字符串分离开来,比如一个字符串中包含有联系人的姓名、性别、年龄以及个人爱好等。在PHP中提供了若干个进行字符串联接和分割的函数。(1)explode()函数
该函数的功能是按照指定的分隔符将一个字符串分开。该函数的语法格式如下:
array explode(string $separator , string $str [, int $limit])
explode函数一共有3个参数,其中第一个参数separator表示分割符号,也就是按照什么原则来进行分割,如果分割符被设置为空,则函数返回False,如果要被分割的字符串中不包含分隔符,则返回整个原始字符串;第二个参数str表示要被分割的字符串;第三个参数limit用来限制被分割后的字符串片断的数量。被分割后的字符串存储在一个数组中。(2)implode()函数
该函数作用刚好和explode函数的作用相反,将一些字符串通过指定的分割符连成一个字符串。该函数的语法格式如下:string implode(string $separator , array $str_array)
该函数有两个参数,第一个参数separator表示连接字符串的连接符号,第二个参数str_array表示需要连接成字符串的数组。例如:<?php $myarray = array('firstname', 'email', 'phone'); //用逗号分隔符连接数组 $comma_separated = implode(",", $myarray); echo $comma_separated; ?> //以上代码输出结果如下:firstname,email,phone
(3)substr()函数
该函数允许访问指定的一个字符串的起始位置和结束位置的子字符串。该函数的语法格式如下:string substr(string $str , int $start [, int $length])
该函数有3个参数,其中参数str是原始字符串,参数start是子字符串的起始位置,参数length为子字符串的长度。该函数返回需要获取的子字符串。如果省略了参数start,则默认从0开始,即从字符串的第一个字符开始,如果省略了参数length,则默认获取从起始位置之后的所有字符。例如:<?php $rest = substr("abcdef", 1); // 返回 "bcdef" $rest = substr("abcdef", 0, 4); //返回"abcd" //字符串也可以直接通过索引直接访问其字符 $string = 'abcdef'; echo $string{0}; //返回a echo $string{3}; //返回d //使用负数作为起始位置 $rest = substr("abcdef", -1); //返回"f" $rest = substr("abcdef", -3, 1); //返回"d" ?>
字符串比较函数
直接比较字符串是否完全一致,可以使用“==”来进行,但是有时候可能需要进行更加复杂的字符串比较,如部分匹配等。在PHP中提供了若干个进行字符比较的函数。
(1)strcmp()函数
该函数进行字符串之间的比较。该函数的语法格式如下:
int strcmp(string $str1 , string $str2)
该函数对传入的两个字符串参数进行比较,如果两个字符串完全相同,则返回0;如果按照字典顺序str1在str2后面,则返回一个正数;如果str1在str2前面,则返回一个负数。例如:<?php $a="i like to fly"; $b="i like to climb"; $back=strcmp($a,$b); if ($back>0) echo '$a大于$b'; elseif ($back<0) echo '$a小于$b'; else echo '$a等于$b'; ?> //以上代码输出结果为:$a大于$b
(2)strcasecmp()函数
该函数同strcmp函数基本一致,但是该函数在比较的时候不区分大小写,而strcmp在比较的时候是区分大小写的。该函数的语法格式如下:
int strcasecmp(string $str1 , string $str2)
(3)strnatcmp()函数
该函数同strcmp函数基本一致,但是比较的原则有所不同。该函数并不是按照字典顺序排列,而是按照“自然排序”比较字符串。所谓“自然排序”就是按照人们的习惯来进行排序。例如用strcmp函数来进行排序,“3”会大于“13”,而在实际中,数字“13”要大于“3”,因此strnatcmp函数是按照后者来进行比较的。该函数的语法格式如下:
int strnatcmp(string $str1 , string $str2)
(4)strnatcasecmp()函数
该函数用法同strnatcmp()函数,只是该函数不区分大小写。该函数的语法格式如下:
int strnatcasecmp(string $str1 , string $str2)
字符串的查找和替换
在PHP编程中经常要进行字符串的查找和替换等操作,在PHP中提供了若干个进行字符查找和替换的函数。
(1)strstr()函数
该函数用于在一个字符串中查找匹配的字符串或者字符。该函数的语法格式如下:
string strstr(string $str , string $search_str)
其中第一个参数str表示原始字符串,第二个参数search_str表示要被查询的关键字,即子字符串或者字符。如果找到了search_str的一个匹配,则该函数返回从search_str开始到整个字符串结束的子字符串,如果没有匹配,则返回False。如果存在不止一个匹配,则返回从第一个匹配位置之后的所有子字符串。例如:<?php $email = '[email protected]'; $domain = strstr($email, '@'); echo $domain; ?> //以上代码输出结果:@shouhu.com //注意:strstr函数还有另外一个别名函数即strchr函数,这两个函数用法和含义一样。
(2)stristr()函数
该函数的用法同strstr函数基本一致,只是该函数是不区分大小写的。该函数的语法格式同strstr()函数。(3)strrchr()函数
该函数的用法同strstr函数基本一致,只是从最后一个搜索到的字符串开始返回。该函数的语法格式同strstr()函数。(4)strpos()函数
该函数在原始字符串中查找目标子字符串第一次出现的位置。该函数的语法格式如下:
int strpos(string $str , string $search_str [, int $offset])
该函数返回第一次出现参数search_str的位置。如果没有找到字符串search_str,则返回False。其中参数offset表示从原始字符串str的第offset个字符开始搜索。(5)strrpos()函数
该函数同strpos函数用法基本一致。只是返回最后一次出现被查询字符串的位置。该函数的语法格式同strpos()函数。(6)str_replace()函数
该函数将用新的子字符串替换原始字符串中被指定要替换的字符串。该函数的语法格式如下:
mixed str_replace(mixed $search , mixed $replace , mixed $subject [, int $count])
函数的参数search表示要被替换的目标字符串,参数replace表示替换后的新字符串,参数subject表示原始字符串。参数count表示被替换的次数。
七、PHP数组
数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体。PHP中的数组较为复杂,但比其他许多高级语言的数组更灵活。数组array是一组有序的变量,其中每个变量被称为一个元素。每个元素由一个特殊的标识符来区分,这个标识符称为键(也称为下标)。数组中的每个实体都包含两项:键和值。可以通过键值来获取相应数组元素,这些键可以是数值键或关联键。如果说变量是存储单个值的容器,那么数组就是存储多个值的容器。
数组的初始化
在PHP中初始化数组的方式主要有两种:一种是直接通过给数组元素赋值的方式初始化数组。另一种是应用array()函数初始化数组。
直接通过给数组元素赋值是一种比较灵活的初始化数组的方式,如果在创建数组时不知道所创建数组的大小,或在实际编写程序时数组的大小可能发生改变,采用这种数组创建的方法比较好。例如:<?php $student[0]="Adam"; $student[1]="James"; $student[2]="Simon"; $student[3]="Tommy"; print_r($student); ?> //输出结果为:Array ( [0] => Adam [1] => James [2] => Simon [3] => Tommy )
使用array()函数可以同时为一个数组分配多个值,这种方式初始化数组比直接给数组元素赋值更加高效。可以使用array()函数按照下面的方式来定义数组$student。
$student = array("Adam","James","Simon","Tommy");
在正常情况下,操作数组使用默认下标。这意味着数组的索引正常情况下从0开始,但是,也可以使用”=>”运算符重载默认下标。在上面的例子中,$student数组中有4个元素,其下标分别是0,1,2,3。可以指定下标从1开始,要实现这一点,可以改写$student数组如下:
$student = array(1=>"Adam","James","Simon","Tommy");
如果此时输出$student数组,输出结果为:
Array ( [1] => Adam [2] => James [3] => Simon [4] => Tommy )
以上数组访问时是通过其数字索引,这种数组被称为数字索引数组。而PHP还支持关联数组,在关联数组中,可以将每个变量值与任何关键字或索引关联起来。例如:<?php $student = array("Adam"=>22,"James"=>23,"Simon"=>24,"Tommy"=>25); print_r($student); ?>
输出结果为:Array ( [Adam] => 22 [James] => 23 [Simon] => 24 [Tommy] => 25 )
关联数组也支持数字索引,但只要索引中有一个不是数字,那么这个数组就是关联数组。
例如$student数组也可以定义为:
$student = array("Adam"=>22,23=>"James",24=>"Simon","Tommy"=>25);
虽然上面数组中带有数字索引(如23和24),但该数组还是关联数组数组的输出和遍历
在PHP中对数组元素进行输出,可以通过输出语句来实现,如echo语句、print语句等,但使用这种输出方式只能对数组中某一元素进行输出。而通过print_r()函数可以将数组结构进行输出。print_r()函数的语法格式如下:bool print_r(mixed $expression)
如果该函数的参数expression为普通的整型、字符串和实型变量,则输出该变量本身。如果该参数为数组,则按照一定键值和元素的顺序显示出该数组中的所有元素。<?php $student = array("Adam"=>22,23=>"James",24=>"Simon","Tommy"=>25); print_r($student); ?> //输出结果为:Array ( [Adam] => 22 [23] => James [24] => Simon [Tommy] => 25 )
遍历数组中的元素是常用的一种操作,在PHP中遍历数组的方法有多种,下面介绍最常用的两种方法。
(1)使用foreach()结构遍历数组
foreach()是一个用来遍历数组中数据的最简单有效的方法。例如:<?php $student = array("Adam"=>22,"James"=>23,"Simon"=>24,"Tommy"=>25); foreach($student as $value){ //以$student数组做循环,输出每个数组元素的值 echo $value ."<br>"; } ?> //结果为22 23 24 25 //使用foreach()结构遍历数组时可以同时将数组的键值(数字和字符索引)和数组元素值输出。 <?php $student = array("Adam"=>22,"James"=>23,"Simon"=>24,"Tommy"=>25); foreach($student as $key=>$value){ //以student数组做循环,输出键和值 echo $key ." 的年龄为 " . $value ."<br>"; } ?> //结果为: //Adam 的年龄为 22 //James 的年龄为 23 //Simon 的年龄为 24 //Tommy 的年龄为 25
(2)使用list() 和each() 函数遍历数组
list()和each()函数通常配合while循环来遍历数组。例如:<?php $student = array("Adam"=>22,"James"=>23,"Simon"=>24,"Tommy"=>25); while(list($key,$val) = each($student)) { echo $key ." 的年龄为 " . $val ."<br>"; } ?>
数组的应用
数组作为PHP中的一种重要的数据结构,与其相关的应用还有很多,下面主要按功能介绍数组的常用应用。- 统计数组元素个数
在PHP中,使用count()函数对数组中的元素个数进行统计。语法格式如下:
int count(mixed $array[,int $mode])
其中array代表要统计的数组。mode为可选参数,当该值取COUNT_RECURSIVE(或1),函数将递归地对数组计数,这对统计多维数组非常有用。mode的默认值为0,此时只能统计一维数组。 数组的排序
在PHP中,提供了一些函数,可以很方便地对数组进行排序。sort()函数对数组进行排序,语法格式如下:bool sort(array $array[,int $sort_flags])
参数array代表要排序的数组,可选参数sort_flags可以用以下值改变排序的行为。SORT_REGULAR:正常比较单元(不改变类型)
SORT_NUMERIC:元素被作为数字来比较
SORT_STRING:元素被作为字符串来比较
SORT_LOCALE_STRING:根据当前的区域(locale)设置来把元素当作字符串比较。sort()函数将数组元素从最低到最高重新排序。同时删除数组元素原有的键名并给排序后数组元素赋与新的键名。而不是仅仅将原有键名重新排序。
asort()函数对关联数组按照键值进行升序排序。成功时返回True,失败时返回False。asort()函数的语法格式同sort()函数。
ksort()函数对数组按照键名排序,保留键名到数据的关联。本函数主要用于关联数组。成功时返回True,失败时返回False。ksort()函数的语法格式同sort()函数。
- 统计数组元素个数
- 多维数组
数组的维数没有限制,数组的维数也可以组合。例如,可以让数组的第一维用整数作为索引,第二维使用字符串作为索引,第三维用整数作为索引等。要访问多维数组的某个元素时需要用到多个下标,例如访问二维数组中的某个元素就需要两个下标。例如:
<?php
$student=array("0"=>array("name"=>"James","sex"=>"male","age"=>"28"),
"1"=>array("name"=>"John","sex"=>"male","age"=>"25"),
"2"=>array("name"=>"Susan","sex"=>"female","age"=>"24"));
Print_r($student);
echo "<br>";
Print $student[2][age];
?>