PHP的脚本由文件中一对特殊的标记所引起的内容,当解释器分析一个文件时,所有特殊标记外的普通文件,解释器不对其做任何处理,而特殊标记内文件将作为PHP代码被解释器分析执行。该运行机制将允许在HTML中嵌入PHP代码。PHP标记外的内容将被完全独立分开,不做任何处理,而内部的将作为PHP代码解析。
用来标记PHP代码块的标记共有4套,其中只有两套总是有效(<?php...?>和<script language="php">...</script>);另外两套可以在php.ini配置文件中开启或者关闭。虽然短格式的标记和ASP风格的标记可能比较省力,但是在与ASP源码混合使用时就很麻烦,就必须要使用长格式的标记。
PHP支持的标记如下:
(1)XML方式的PHP起始和结束标记。
<?php
在此写PHP程序
?>
(2)SGML方式的PHP起始和结束标记。
<?
在此写PHP程序
?>
(3)正规方式的PHP起始和结束标记。
<script language="php">
在此写PHP程序
</script>
(4)ASP方式的PHP起始和结束标记。
<%
在此写PHP程序
%>
在写PHP程序时,各语句间的分隔方式与C或者Perl类似,由分号(;)隔开。
例如,使用第一种标记嵌入HTML语言,在网页上显示“这句话是使用PHP显示的”。
<html>
<head>
<title>这是我第一个程序</title>
</head>
<body>
<?php
echo "这句话是使用PHP显示的";
?>
</body>
</html>
使用“.php”扩展名保存该内容,Internet Explorer查看结果网页,如图12-1所示。在PHP代码块中,使用echo语句,可以实现字符串等变量的输出,从而使其在网页上显示。
图12-1 第一个PHP
6.3.6节对注释做了简单的介绍。在PHP程序中,加入注释的方法很灵活。可以使用C语言、C++语言或者是UNIX的Shell语言的注释方式,而且也可以混合使用。“//”或“#”符号可对单行进行注释;“/*……*/”可对多行语句进行注释。下面在PHP中同时使用3种注释:
<?php
echo "这是第一种例子。\n"; // 本例是C++ 语言的注释
/* 本例采用多行的C语言
注释方式 */
echo "这是第两种例子。\n";
echo "这是第三种例子。\n"; # 本例使用UNIX Shell 语法注释
?>
不过在使用多行注释时请注意,不能让注释陷入递归循环当中,即在“/*……*/”多行注释中不能再包括其他“/*……*/”注释,否则会引起错误。
<?php
/*
echo "这是错误的注释"; /* 递归注释会引起问题*/
*/
?>
结果如图12-2所示。
图12-2 错误注释
PHP支持8种变量类型。
· 4种标量类型:布尔型(boolean)、整型(integer)、浮点型(float)、字符串(string)。
· 两种复合类型:数组(array)、对象(object)。
· 两种特殊类型:资源(resource)、NULL。
要使用变量,只要在英文字符串前面加“$”,目前变量仍不能使用中文,PHP是区分大小写的,即$var与$Var是两个不同的变量。变量的类型通常不是由程序员设定的,确切地说,是由PHP根据该变量使用的上下文在运行时决定的。
(1)布尔型。
这是最简单的类型,可以为TRUE或FALSE。如下代码可以指定布尔型。
<?php
$foo = True; // 指定$foo的值为True
?>
(2)整型。
一个整形的变量可以是整数集合{…,-2,-1,0,1,2,…}中的任一个数。
整型值可以用十进制,十六进制或八进制符号指定,前面可以加上“-”或者“+”明确表示正负性。如果用八进制符号,数字前必须加上0(零),用十六进制符号数字前必须加上0x。使用方法如下:
<?php
$a = 1234; # 正整数
$a = -123; # 负整数
$a = 0123; # 八进制数(等于十进制的83)
$a = 0x1A; # 十六进制数(等于十进制的26)
?>
(3)浮点型。
浮点数,即实数,可以采用科学记数法表示:
<?php
$a = 1.234;
$a = 1.2e3; # 1.2*103
$a = 7E-10; # 7*10-10
?>
(4)字符串。
字符串即一串字符,无论是单一字符或数千字的字符串都是使用这个变量类型。
指定一个简单字符串的最简单的方法是用单引号(')括起来。要表示一个单引号,需要用反斜线(\)转义,和很多其他语言一样。如果在单引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。
如果用双引号(")括起字符串,PHP会懂得更多特殊字符的转义序列。例如,"这是字符串\n"就是让字符串在结束时换行。若是“\x”加上二位数字,如“\xFE”即表十六进位字符。当用双引号指定字符串时,其中的变量会被解析,如果跟字符串中其他字符连接,可以使用“{}”分隔。
<?php
$a = 24;
$name = '小王';
$enname = 'Peter';
echo "$enname is $a" ; //英文中有空格间格,不用分隔符,此句输出为“Peter is 24”
echo "$name{$a}岁"; //$a与“岁”相连,会导致错误,故用“{}”分隔,输出为“小王24岁”
?>
(5)数组。
数组变量,可以是二维、三维或者多维数组,其中的元素也很自由,可以是字符串、整数或者实数,甚至是数组,但索引必须为整数或字符串。可以用array()来新建一个数组,它接受一定数量用逗号分隔的“key => value”参数对。若未指定索引,则默认从0开始;若插入新元素时,未指定索引,则新索引默认比最大的整数索引大一。显示数组值时,使用“$数组名[索引]”。
<?php
$arr = array("小王" => "男", 24 => True);
echo $arr["小王"]; // 男
echo $arr[24]; // 1
?>
(6)对象。
类是变量与作用于这些变量的函数的集合,可以使用class语句创建一个类。根据类,可以创建对象。要初始化一个对象,可以使用new语句。
<?php
class foo //创建类
{
function do_foo()
{
echo "Doing foo.";
}
}
$bar = new foo; //使用对象
$bar->do_foo(); //调用类中的函数
?>
(7)资源。
一个资源是一个特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的,比如打开文件、数据库连接、图形画布区域等。
(8)NULL。
特殊的NULL值表示一个变量没有值。NULL类型唯一可能的值就是NULL(区分大小写)。
在下列情况下一个变量被认为是NULL。
· 被赋值为NULL。
· 尚未被赋值。
· 被unset()。
就像大部份的结构化程序有全局变量与局部变量,PHP在这方面也是有相同的处理方式。
在PHP的程序执行时,系统会在内存中保留一块全局变量的区域。实际运用时,可以通过$GLOBALS["变量名称"]将需要的变量取出。在用户自定的函数或程序中,就可以用$GLOBALS 数组取出需要的变量。此时要特别注意PHP的变量有大小写之分。
$GLOBALS数组是PHP程序中比较特殊的变量,不必定义,系统会自动匹配相关的变量在里面。在函数中,也不必管$GLOBALS数组是否已经做全局定义,就可以直接使用了。
在PHP中,全局变量的有效范围(scope)仅限于主要程序中,不会影响到函数中同名的变量,也就是全局变量与局部变量互不侵犯。若要变量在函数中使用,就要用到$GLOBALS数组或是使用global语句进行定义。
外部变量在其他程序语言中也许并不重要,但在PHP语言中,却是频繁使用的。这是由于这些变量,才使得PHP与HTML完好地结合,实现了很多交互友好的功能。
在PHP语言中有如下3种外部变量。
(1)HTML表单。
当一个表单体交给PHP脚本时,表单中的信息会自动在脚本中可用。有很多方法访问此信息。例如,在下列HTML表单中,
<form action="foo.php" method="POST">
姓名:<input type="text" name="username"><br>
电邮:<input type="text" name="email"><br>
<input type="submit" name="submit" value="提交">
</form>
当单击“提交”按钮时,表单中的变量值将以表单中method指定的POST方法提交给action中指定的foo.php这个PHP脚本文件处理,若表单中未指定action变量,则提交给脚本文件自身。
所提交的变量名由控件名决定,如姓名后的文本框,其变量值即为username,“提交”按钮的变量名即为submit。一般情况下,表单会提交多个数据,脚本会以数组的形式保存这些变量的值,所以这些变量名将作为数组的索引使用。例如用$HTTP_POST_VARS['username']来引用上述表单中的“姓名”数据。
根据PHP的版本的不同,可以有如下几种方法使用表单中以POST方式提交的变量。
<?php
// 自PHP 4.1.0 起可用
print $_POST['username'];
print $_REQUEST['username'];
import_request_variables('p', 'p_');
print $p_username;
// 自PHP 3 起可用。自PHP 5.0.0 起,这些较长的预定义变量
// 可用register_long_arrays 指令关闭
print $HTTP_POST_VARS['username'];
// 如果PHP 指令register_globals = on 时可用。不过自
// PHP 4.2.0 起默认值为register_globals = off
// 不提倡使用/依赖此种方法
print $username;
?>
例如,可以使用下列语句来显示提交的姓名和电子邮件。
<form method="POST">
姓名:<input type="text" name="username"><br>
电邮:<input type="text" name="email"><br>
<input type="submit" name="submit" value="提交">
</form>
<?php
echo '我的名字是'.$HTTP_POST_VARS['username'].',';
echo '我的邮箱是'.$HTTP_POST_VARS['email'].'。';
?>
本例中未指定提交的脚本文件,所以默认提交给自身。当在文本框中输入名字和邮箱后,单击“提交”按钮,结果网页如图12-3所示。
图12-3 输出姓名、邮箱
网页中常用的表单控件有文本框、密码框、文本区、按钮、图像按钮、单选按钮、复选框和列表框等,其HTML语言分别如下:
<input type="text" name="text" value="文本框"><br>
<input type="password" name="password" value="密码框"><br>
<textarea name="texarea">文本区</textarea><br>
<input type="button" name=submit value="按钮"><br>
<input type="image" name=image src="f.bmp"><br>
<input type="radio" name=radio>单选按钮<br>
<input type="checkbox" name=check>复选框<br>
<select name="select" multiple >
<option>列表选项1</option>
<option selected>列表选项2</option>
<option>列表选项3</option>
<option>列表选项4</option>
</select>
结果网页如图12-4所示,其中包含了常用的各种表单控件。
图12-4 各种表单控件
(2)图像提交变量。
当提交表单时,可以用一幅图像代替标准带标签名的提交按钮即图像按钮,用类似这样的HTML标记语言:
<input type="image" src="image.gif" name="sub">
当用户单击图像中的某处时,相应的表单会被传送到服务器,并加上两个变量sub_x和sub_y。它们包含了用户单击图像的坐标。事实上,被浏览器发送的实际变量名包含的是一个点而不是下画线,但PHP自动将点转换成了下画线。
例如,执行下列语句,可以检验每次单击的图像坐标。
<form method="POST">
<input type="image" src="f.bmp" name="sub">
</form>
<?php
echo '你单击的横坐标为'.$HTTP_POST_VARS['sub_x'].',';
echo '纵坐标为'.$HTTP_POST_VARS['sub_y'].'。';
?>
其运行的结果网页如图12-5所示,通过不断单击,可以发现,图像的左上角坐标为(0,0),而右下角的坐标为(图像的宽,图像的高)。在实现应用中,可以根据返回的坐标不同,而执行不同的语句,如果图像为一张中国地图,则可以根据图标,单击不同的省份,则返回不同的坐标,并以此来判断单击的省份,然后显示相应省份的地图。
图12-5 图像按钮
(3)HTTP cookies。
PHP支持Netscape规范定义中的HTTP cookies。cookies是一种在远端浏览器端存储数据并能追踪或识别再次访问的用户的机制,用于跟踪和鉴定用户的身份。可以用setcookie() 函数来设定cookies。cookies是HTTP信息头中的一部分,因此Setcookie函数必须在向浏览器发送任何输出之前调用。这和header()函数的限制是一致的。cookie数据会在相应的cookie数据数组中可用。例如$_COOKIE,$HTTP_COOKIE_VARS和$_REQUEST。
如果希望对单个cookie指派多个值,只要在cookie的名字后面加上“[]”,这样PHP将会以数组的类型保存这多个变量。
· 算术运算符:用来处理四则运算的符号,是最简单最常用的符号,尤其是数字的处理,几乎都会使用到算术运算符。算术运算符包括:+、-、*、/、%、++、--。其中%表示取余数,++表示自加,--表示自减。例如“$i=4;$i++;”,这样$i就会变成5,而经过“$i--”之后,$i又会变回4。
· 字符串运算符:字符串的运算符只有一个,就是英文的句号“.”,它可以将字符串连接起来,变成合并的新字符串。
· 赋值运算符:基本的赋值运算符是“=”,它意味着把右边表达式的值赋给左运算数。还有+=、-=、*= 、/=、.=、%=、&=、|=、^= 、~=、<<=、>>=等组合赋值符,可以使得在一个表达式中使用它的值并把运算结果赋回给它。比如“$a+=3”表示把$a加3后赋给$a,如果$a的初值为1,则执行该语句后为4。
· 按位运算符:按位与(&)、按位或(|)、按位异或(^)、向左位移(<<)、向右位移(>>)、按位非(~)。
· 逻辑运算符:通常用来测试真假值,最常见到的逻辑运算符就是循环处理,用来判断是否该离开循环或继续执行循环内的指令。包括:小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、不等于(!=)、与(and)、或(||)、异或(xor)、非(!)。
· 三元运算符:即“?:”。当执行“a?b:c”语句时,若a的值为真,则执行b语句,若a的值为假,则执行c语句,是一个比较简单的条件判断语句。
下面举几个例子,来加深读者对PHP中运算符的理解。
(1)算术运算符。
以下为简单的算术运算符的例子。
<?php
$a=8;
$b=3;
echo "已知a={$a},b={$b}<br>可得:<br>"; //直接显示$a、$b变量的值
echo 'a+b=',$a+$b;
echo '<br>'; //换行
echo 'a-b=',$a-$b;
echo '<br>';
echo 'a*b=',$a*$b;
echo '<br>';
echo 'a/b=',$a/$b;
echo '<br>';
echo 'a%b=',$a%$b;
echo '<br>';
$a++;
echo 'a自加后变为',$a;
echo '<br>';
$b--;
echo 'b自减后变为',$b;
?>
其运行结果如图12-6所示。
图12-6 算术运算符
(2)字符串运算符。
字符串运算符只有一个,即小数点“.”,它可以将字符串连接起来,合并成新的字符串。以下例子充分使用了字符串运算符。
<?php
$i='我';
$u='你';
$is='是';
$not='不';
$goodman='好人';
echo $i.$is.$goodman;
echo '<br>'; //换行
echo $u.$is.$not.$goodman;
echo '<br>'; //换行
echo $u.$is.$not.$i;
echo '<br>'; //换行
echo $i.$is.$not.$u;
echo '<br>'; //换行
echo $u.$is.$u.',' .$i.$is.$i; //中间连接逗号,分隔两句话
?>
其运行结果如图12-7所示。
图12-7 字符串运算符
(3)赋值运算符。
赋值运算符有时让人搞得不知所云,但是它可以使程序更加简练,更加高效。最简单的赋值符即“=”,它将右边的值赋给左边。而组合赋值运算符则较复杂。例如要让$i值增加2,可以使用算术运算符实现即“$i=$i+2”,但也可以使用赋值运算符即“$i+=2”,若要让$i扩大4倍,则可以写成“$i*=4”。“=”还可以与字符串连接符“.”连用,使得原字符串能够很方便的延长,如果要把$s由“PHP”变成“PHP语言”,直接可以利用“.=”组合赋值符实现,即“$s.= '语言'”。
下面的例子充分使用了赋值运算符。
<?php
$a = 5;
echo 'a原来是'.$a.'<br>';
$a *=2;
echo '然后翻倍变为'.$a.'<br>';
$a /=10;
echo '之后取十分之一变成'.$a.'<br>';
$a -=1;
echo '最终又减一变成'.$a.'<br>';
echo '<hr>'; //打印一条水平线,作为界限
$b='人';
echo 'b原来是一个字:'.$b.'<br>';
$b .='为';
echo '然后组词为:'.$b.'<br>';
$b .='什么活着';
echo '然后造句为:'.$b.'<br>';
?>
其最终的结果网页如图12-8所示。
图12-8 赋值运算符
(4)按位运算符。
在进行位运算时,可以首先把整数数据转换为二进制数据,再对二进制数据进行按位运算。如果两个二进制数中对应数位上的数均为1,则按位与为1,按位或为1,按位异或为0;对应数位上的数均为0,则按位与为0,按位或为0,按位异或为0;对应数位上的数分别为0和1,则按位与为0,按位或为1,按位异或为1。
例如,当a=5且b=6时,首先将a化为二进制即101,将b化为二进制即110,则两者的按位与a&b=100,即十进制中的4,两者的按位或a|b=111,即十进制中的7,两者的按位异或a^b=11,即十进制的3,将a向左移两位即a<<2,空位为0,则变成10100,化成十进制即为20,将b向右移一位即b>>1,则变成11,即十进制中的3,可以通过如下的语句检验计算的结果。
<?php
$a=5;
$b=6;
echo "已知a={$a},b={$b}<br>可得:<br>"; //直接显示$a、$b变量的值
echo 'a&b=',$a&$b;
echo '<br>'; //换行
echo 'a|b=',$a|$b;
echo '<br>';
echo 'a^b=',$a^$b;
echo '<br>';
echo 'a<<2=',$a<<2;
echo '<br>';
echo 'b>>1=',$b>>1;
?>
结果网页如图12-9所示。
图12-9 按位运算符
(5)逻辑运算符、三元运算符。
逻辑运算符要来测试表达式的真假,需要通过与循环、条件等语句联合使用,从而根据测试表达式的真假来决定究竟执行哪些语句以及是否还要继续执行循环,也可以与三元运算符联合使用。
例如,在左右两个文本框中分别输入整数a和b,单击“比较”按钮后,比较这两个整数,如果a大,则输出a比b大几,否则输出a比b小几。
<form method="POST">
已知:a=<input type="text"name="a">,
b=<input type="text"name="b">
<input type="submit"name="submit" value="比较">
</form>
<?php
$a=$HTTP_POST_VARS['a']; //获取a的值
$b=$HTTP_POST_VARS['b']; //获取b的值
echo ($a>$b)?'a比b大'.($a-$b):'a比b小'.($b-$a);
?>
结果网页如图12-10所示,根据a和b实际的输入值大小来决定输出“a比b大”或“a比b小”。
图12-10 逻辑三元运算符
任何PHP脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,甚至一个什么也不做的(空语句)条件语句。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。下面介绍一些典型的语句类型。
(1)if。
if语句是一个条件判断语句,它根据一定条件执行相应的语句块,其语法与C语言很相似,最简单的格式如下:
if (expr)
statement
当expr表达式为True时,则执行statement语句。例如,如果$a大于$b,则显示“前一个数大”。
<?php
if ($a > $b)
echo "前一个数大";
?>
而且if语句是可以嵌套的,在if语句的模块中,还可以包含其他if语句。其定义格式如下:
if(expr)
{
code_block1
if(expr) code_block3 //嵌套于第一个if中
}
else
{
code_block2
}
例如,在文本框中输入一个分数$score,单击“评判”按钮后需要判断它是否及格。如果及格,则再判断是否达到85分优秀,如果达到,则输出“该分数达到优秀”,否则输出“该分数已及格,但未达到优秀”;如果不及格,则直接输出“该分数不及格”,假设$score初值为84,则可以通过以下代码检查$score是否及格以及是否优秀。
<form method="POST">
请输入分数:<input type="text"name="score">
<input type="submit"name="submit" value="评判">
</form>
<?php
$score=$HTTP_POST_VARS['score']; //获取score的值
echo "分数为{$score}分<br>";
if($score>=60){
if($score>=85)
echo '该分数达到优秀';
else
echo '该分数已及格,但未达到优秀';
}
else
echo '该分数不及格';
?>
结果网页如图12-11所示。
图12-11 if嵌套
另外,在多种情况的判断时,可以使用elseif语句,与else不一样的是,elseif将已经为假的条件再进行一次判断。
例如,上述if嵌套的语句可以改写成如下语句,执行结果与上例完全一致,但是相比而言,显得更为有条理。
<form method="POST">
请输入分数:<input type="text"name="score">
<input type="submit"name="submit" value="评判">
</form>
<?php
$score=$HTTP_POST_VARS['score']; //获取score的值
echo "分数为{$score}分<br>";
if($score>=85)
echo '该分数达到优秀';
elseif($score>=60)
echo '该分数已及格,但未达到优秀';
else
echo '该分数不及格';
?>
(2)switch。
switch 语句首先计算表达式的值,然后根据表达式所计算出的值来选择与之匹配的case后面的值,并执行该case后面的语句,直到遇到了一个break语句为止。如果所计算出的值与任何一个case后面的值都不相符,则执行default后的语句。它与C语言的格式也相似,具体格式如下:
switch(expr) {
case 1: code_block1
break;
case 2: code_block2
break;
case 3: code_block3
break;
……
default: code_blockn
}
例如,如果$i等于0或1或2,则输出相应的结果,否则,输出$i谁也不等于,运行的结果网页如图12-12所示。
<form method="POST">
请输入i:<input type="text"name="i">
<input type="submit"name="submit" value="提交">
</form>
<?php
$i=$HTTP_POST_VARS['i']; //获取i的值
switch ($i) {
case 0:
print "i等于0";
break;
case 1:
print "i等于1";
break;
case 2:
print "i等于2";
break;
default:
print "i不但不等于0,也不等于1,还不等于2";
}
?>
图12-12 switch语句
switch语句可以转换为if语句,上述switch语句就可以转化为如下的if语句,而运行结果完全一致。
<form method="POST">
请输入i:<input type="text"name="i">
<input type="submit"name="submit" value="提交">
</form>
<?php
$i=$HTTP_POST_VARS['i']; //获取i的值
if ($i == 0) {
print "i等于0";
} elseif ($i == 1) {
print "i等于1";
} elseif ($i == 2) {
print "i等于2";
}
else print "i不但不等于0,也不等于1,还不等于2";
?>
但是相比较而言,switch语句显得更有条理,也更为直观。
(3)for。
for语句用来产生一段循环程序,其语法格式如下:
for(init; test; incre)
{
code_block
}
这里init和incre是两个语句,test是一个表达式。init语句只执行一次,用来初始化循环变量。test表达式在每次循环后都要计算一次,如果其运算值为“假”,则循环被中止并立即继续执行for语句之后的语句,否则执行code_block语句块,循环完成后执行一次incre语句块。使用break语句可用来从循环中退出。
例如,要求输入一个整数n,提交后输出从1到n所有整数的加法式以及它们的和。
<form method="POST">
请输入n:<input type="text"name="n">
<input type="submit"name="submit" value="求和">
</form>
<?php
$n=$HTTP_POST_VARS['n']; //获取n的值
for ($i = 1; $i <= $n; $i++) {
$sum += $i; //累加
echo $i;
if($i<$n)
echo '+'; //如果不是最后一项,则输出+
else
echo '='.$sum;//如果是最后一项,则计算结束输出=和
}
?>
若输入36,则结果网页如图12-13所示。
图12-13 输出1至36的和
(4)foreach。
foreach一种遍历数组简便方法,它仅能用于数组,当试图将其用于其他数据类型或者一个未初始化的变量时会产生错误。它有如下两种语法:
foreach (array_expression as $value) statement
foreach (array_expression as $key => $value) statement
第一种格式遍历给定的array_expression 数组。每次循环中,当前单元的值被赋给$value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。第二种格式做同样的事,只除了当前单元的键值也会在每次循环中被赋给变量$key。不论采用哪一种格式,当foreach开始执行时,数组内部的指针会自动指向第一个单元。
例如,可以按序显示地支。
<?php
$arr=array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥");
foreach ($arr as $value)echo $value; //按序显示地支
?>
将这段代码保存为test.php,其结果网页如图12-14所示。
图12-14 显示十二地支
这并不能显示其优越性,如果稍加修改,代码如下:
<?php
$arr=array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌",
"亥");
$arr2=array("鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡",
"犬", "猪");
foreach ($arr as $key=>$value)echo $value.$arr2[$key].'<br>'; //按序显示十二地支与十二生肖
?>
此时结果网页如图12-15所示,在使用foreach遍历$arr时,实现了$arr与$arr2对应值的连接。
图12-15 显示十二地支生肖
以上所举两例均为一个foreach语句。事实上,foreach语句与if、for语句一样,都是可以嵌套的。下面一例通过两个foreach嵌套,打印出六十天干地支。
<?php
$arr1=array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸");
$arr2=array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌",
"亥");
foreach ($arr1 as $key1=>$value1){
foreach ($arr2 as $key2=>$value2)
if(($key1+$key2)%2==0)echo $value1.$value2.' '; //不存在甲丑、乙子这样的组合
echo '<br>';//下一个天干时换行
}
?>
运行结果如图12-16所示。
图12-16 显示六十天干地支表
(5)while。
while语句用于不知道循环体要执行多少次的循环语句,语法如下:
while(expr){
code_block;
}
do…while语句与while语句所执行的功能完全一样,唯一不同的是do…while语句不管条件是否成立,其循环体至少执行一次,然后再去判断表达式的取值是否为真,而while只要知道表达式为真则执行循环体。do…while语法的格式如下:
do{
code_block
}while(expr);
例如,要网页中显示20次“我再也不敢上非法网站了”字符串,在前面加上序号,从1到20,可以通过如下代码实现:
<?php
$i=1;
$max=20;
do{
echo $i++; //显示序号
echo '我再也不敢上非法网站了';
echo '<br>'; //换行
}while($i<=$max)
?>
运行结果如图12-17所示。
图12-17 循环打印字符串