PHP控制结构1.docx
- 文档编号:1783746
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:15
- 大小:21.77KB
PHP控制结构1.docx
《PHP控制结构1.docx》由会员分享,可在线阅读,更多相关《PHP控制结构1.docx(15页珍藏版)》请在冰点文库上搜索。
PHP控制结构1
PHP控制结构
7.for
for 循环是PHP中最复杂的循环结构。
它的行为和C语言的相似。
for 循环的语法是:
for(expr1;expr2;expr3)
statement
第一个表达式(expr1)在循环开始前无条件求值一次。
expr2 在每次循环开始前求值。
如果值为 TRUE,则继续循环,执行嵌套的循环语句。
如果值为FALSE,则终止循环。
expr3 在每次循环之后被求值(执行)。
每个表达式都可以为空或包括逗号分隔的多个表达式。
表达式 expr2 中,所有用逗号分隔的表达式都会计算,但只取最后一个结果。
expr2 为空意味着将无限循环下去(和C一样,PHP认为其值为 TRUE)。
这可能不像想象中那样没有用,因为经常会希望用 break 语句来结束循环而不是用 for 的表达式真值判断。
考虑以下的例子,它们都显示数字1到10:
php
/* example 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* example 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* example 3 */
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* example 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?
>
当然,第一个例子看上去最正常(或者第四个),但用户可能会发现在 for 循环中用空的表达式在很多场合下会很方便。
PHP也支持用冒号的 for 循环的替代语法。
for(expr1;expr2;expr3):
statement;
...
endfor;
我们经常需要对下面这样的数组进行遍历:
php
/*
* 我们想要在遍历的过程中改变以下数组中某些元素的值
*/
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < sizeof($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?
>
以上代码的问题,在于for的第二个表达式会导致代码执行很慢--因为每次循环时都要计算一遍数组的长度。
由于数组的长度始终不变,我们可以用一个中间变量来存储数组长度,然后用这个变量作为for循环的第二个表达式。
这样在循环的时候就可以直接使用该变量的值,不用每次重新计算。
如下:
php
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?
>
8.foreach
PHP4引入了 foreach 结构,和Perl以及其他语言很像。
这只是一种遍历数组简便方法。
foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。
有两种语法,第二种比较次要但却是第一种的有用的扩展。
foreach(array_expressionas$value)
statement
foreach(array_expressionas$key=>$value)
statement
第一种格式遍历给定的 array_expression 数组。
每次循环中,当前单元的值被赋给 $value并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。
自PHP5起,还可能遍历对象。
Note:
当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。
这意味着不需要在foreach 循环之前调用 reset()。
Note:
除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。
foreach对数组指针有些副作用。
除非对其重置,在foreach循环中或循环后都不要依赖数组指针的值。
自PHP5起,可以很容易地通过在 $value 之前加上&来修改数组的元素。
此方法将以引用赋值而不是拷贝一个值。
php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?
> 此方法仅在被遍历的数组可以被引用时才可用(例如是个变量)。
php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?
>
Warning
Referenceofa $value andthelastarrayelementremainevenafterthe foreachloop.Itisrecommendedtodestroyitby unset().
Note:
foreach 不支持用“@”来抑制错误信息的能力。
用户可能注意到了以下的代码功能完全相同:
php
$arr = array("one", "two", "three");
reset($arr);
while (list(, $value) = each($arr)) {
echo "Value:
$value
";
}
foreach ($arr as $value) {
echo "Value:
$value
";
}
?
> 以下代码功能也完全相同:
php
$arr = array("one", "two", "three");
reset($arr);
while (list($key, $value) = each($arr)) {
echo "Key:
$key; Value:
$value
";
}
foreach ($arr as $key => $value) {
echo "Key:
$key; Value:
$value
";
}
?
>
示范用法的更多例子:
php
/* foreach example 1:
value only */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Current value of $a:
$v.";
}
/* foreach example 2:
value (with its manual access notation printed for illustration) */
$a = array(1, 2, 3, 17);
$i = 0; /* for illustrative purposes only */
foreach ($a as $v) {
echo "$a[$i] => $v.";
$i++;
}
/* foreach example 3:
key and value */
$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach ($a as $k => $v) {
echo "$a[$k] => $v.";
}
/* foreach example 4:
multi-dimensional arrays */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2 ";
}
}
/* foreach example 5:
dynamic arrays */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v ";
}
?
>
9.break
break 结束当前 for,foreach,while,do-while 或者 switch 结构的执行。
break 可以接受一个可选的数字参数来决定跳出几重循环。
php
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each($arr)) {
if ($val == 'stop') {
break; /* You could also write 'break 1;' here. */
}
echo "$val
";
}
/* 使用可选参数 */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5
";
break 1; /* 只退出 switch. */
case 10:
echo "At 10; quitting
";
break 2; /* 退出 switch 和 while 循环 */
default:
break;
}
}
?
>
10.continue
continue 在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。
Note:
注意在PHP中 switch 语句被认为是可以使用 continue 的一种循环结构。
continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。
php
while (list ($key, $value) = each($arr)) {
if (!
($key % 2)) { // skip odd members
continue;
}
do_something_odd($value);
}
$i = 0;
while ($i++ < 5) {
echo "Outer
";
while
(1) {
echo " Middle
";
while
(1) {
echo " Inner
";
continue 3;
}
echo "This never gets output.
";
}
echo "Neither does this.
";
}
?
>
省略 continue 后面的分号会导致混淆。
以下例子示意了不应该这样做。
php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i ";
}
?
>
希望得到的结果是:
0
1
3
4
可实际的输出是:
2
因为 print() 调用的返回值是 int
(1),看上去作为了上述可选的数字参数。
11.switch
switch 语句和具有同样表达式的一系列的IF语句相似。
很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。
这正是 switch 语句的用途。
Note:
注意和其它语言不同,continue 语句作用到switch上的作用类似于 break。
如果在循环中有一个switch并希望continue到外层循环中的下一个轮回,用 continue2。
Note:
Notethatswitch/casedoesloosecomparision.
下面两个例子使用两种不同方法实现同样的事,一个用一系列的 if 语句,另一个用 switch 语句:
Example#1 switch 结构
php
if ($i == 0) {
echo "i equals 0";
} elseif ($i == 1) {
echo "i equals 1";
} elseif ($i == 2) {
echo "i equals 2";
}
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
}
?
>
Example#2 switch 结构可以用字符串
php
switch ($i) {
case "apple":
echo "i is apple";
break;
case "bar":
echo "i is bar";
break;
case "cake":
echo "i is cake";
break;
}
?
>
为避免错误,理解 switch 是怎样执行的非常重要。
switch 语句一行接一行地执行(实际上是语句接语句)。
开始时没有代码被执行。
仅当一个 case 语句中的值和 switch 表达式的值匹配时PHP才开始执行语句,直到 switch 的程序段结束或者遇到第一个 break 语句为止。
如果不在case的语句段最后写上 break 的话,PHP将继续执行下一个case中的语句段。
例如:
php
switch ($i) {
case 0:
echo "i equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 2";
}
?
>
这里如果 $i 等于0,PHP将执行所有的print语句!
如果 $i 等于1,PHP将执行后面两条print语句。
只有当 $i 等于2时,才会得到“预期”的结果——只显示“iequals2”。
所以,别忘了 break 语句就很重要(即使在某些情况下故意想避免提供它们时)。
在 switch 语句中条件只求值一次并用来和每个 case 语句比较。
在 elseif 语句中条件会再次求值。
如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用 switch 语句可能会快一些。
在一个case中的语句也可以为空,这样只不过将控制转移到了下一个case中的语句。
php
switch ($i) {
case 0:
case 1:
case 2:
echo "i is less than 3 but not negative";
break;
case 3:
echo "i is 3";
}
?
>
一个case的特例是 default。
它匹配了任何和其它case都不匹配的情况。
例如:
php
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
}
?
>
case 表达式可以是任何求值为简单类型的表达式,即整型或浮点数以及字符串。
不能用数组或对象,除非它们被解除引用成为简单类型。
switch 支持替代语法的流程控制。
更多信息见流程控制的替代语法一节。
php
switch ($i):
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
endswitch;
?
>
允许使用分号(;)代替case语句后的冒号(:
),例如:
php
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'heineken';
echo 'Good choice';
break;
default;
echo 'Please make a new selection...';
break;
}
?
>
12.declare
declare 结构用来设定一段代码的执行指令。
declare 的语法和其它流程控制结构相似:
declare(directive)
statement
directive 部分允许设定 declare 代码段的行为。
目前只认识两个指令:
ticks(更多信息见下面 ticks 指令)以及 encoding(更多信息见下面 encoding指令)。
Note:
encoding是PHP5.3.0新增指令。
declare 代码段中的 statement 部分将被执行——怎样执行以及执行中有什么副作用出现取决于 directive 中设定的指令。
declare 结构也可用于全局范围,影响到其后的所有代码(但如果有 declare 结构的文件被其它文件包含,它对包含它的文件不起作用)。
php
// these are the same:
// you can use this:
declare(ticks=1) {
// entire script here
}
// or you can use this:
declare(ticks=1);
// entire script here
?
>
Ticks
Caution
ticks指令在PHP5.3.0中是过时指令,将会从PHP6.0.0移除。
Tick是一个在 declare 代码段中解释器每执行 N 条低级语句就会发生的事件。
N 的值是在declare 中的 directive 部分用 ticks=N 来指定的。
在每个tick中出现的事件是由 register_tick_function() 来指定的。
更多细节见下面的例子。
注意每个tick中可以出现多个事件。
Example#1评估一段PHP代码的执行时间
php
// A function that records the time when it is called
function profile($dump = FALSE)
{
static $profile;
// Return the times stored in profile, then erase it
if ($dump) {
$temp = $profile;
unset($profile);
return ($temp);
}
$profile[] = microtime();
}
// Set up a tick handler
register_tick_function("profile");
// Initialize the function before the declare block
profile();
// Run a block of code, throw a tick every 2nd statement
declare(ticks=2) {
for ($x = 1; $x < 50; ++$x) {
echo similar_text(md5($x), md5($x*$x)), "
;";
}
}
// Display the data stored in the profiler
print_r(profile (TRUE));
?
> 这个例子评估“declare”中的PHP代码,每执行两条低级语句就记录一次时间。
此信息可以用来找到一段特定代码中速度慢的部分。
这个过程也可以用其它方法完成,但用tick更方便也更容易实现。
Ticks很适合用来做调试,以及实现简单的多任务,后台I/O和很多其它任务。
参见 register_tick_function() 和 unregister_tick_function()。
Encoding
Ascript'sencodingcanbespecifiedper-scriptusingtheencodingdirective.
Example#2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP 控制 结构