【php手册:流程控制】流程控制的替代语法,while,do...while,for,foreach,break,continue,do...whileforeach
PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。
替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
注意:不支持在同一个控制块内混合使用两种语法。
if
<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>
switch
<?php $foo = 1 ?>
<?php switch ($foo): ?>
<?php case 1: ?>
123
<?php endswitch ?>
while
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
?>
冒号语法
<?php
/* 不正确的使用方法: */
if($a > $b):
echo '1';
else if($a == $b): // 将无法编译
echo '2';
endif;
/* 正确的使用方法: */
if($a > $b):
echo '1';
elseif($a == $b): // 注意使用了一个单词的 elseif
echo '2';
else:
echo '3';
endif;
?>
不用冒号和大括号
<?php
if ($a)
print "a is true";
else
print "a is false";
?>
endif用法
<?php
$var = 2;
if($var == '1'):
else:
if($var == '2'):
echo 2;
endif;
endif;
流程控制符注意点
<?php
$foo = 'foo';
$bar = 'bar';
if (isset($bar)):
if (isset($foo)) echo "Both are set.";;//去掉分号将报错
elseif (isset($foo)):
echo "Only 'foo' is set.";
else:
echo "Only 'bar' is set.";
endif;
?>
do-while
<?php
#特殊用法
$i = 5;
$factor = 1;
$minimum_limit = 5;
do {
if ($i < 5) {
echo "i is not big enough";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i is ok";
/* process i */
} while(0);
?>
<?php
#生成1到1000之间的随机偶数的数组
$numbers = array();
$array_size = 10;
for ($i=0;$i<$array_size;$i++) {
do {
$random = rand(1,1000);
} while (($random % 2) == 1);
$numbers[] = $random;
}
asort($numbers);
echo '<pre>';
print_r($numbers);
echo '</pre>';
?>
for
for (expr1; expr2; expr3)
statement
每个表达式都可以为空或包括逗号分隔的多个表达式。
表达式 expr2 中,所有用逗号分隔的表达式都会计算,但只取最后一个结果。
expr2 为空意味着将无限循环下去(和 C 一样,PHP 暗中认为其值为 TRUE)。
<?php
/* example ` */
$i = 1;
for(;;):
echo $i.PHP_EOL;
if($i>9){
break;
}
$i++;
endfor;
/* example 1 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
//表达式2中可有多个,但只取最后一个结果,意味着前面的多个表达式都是无效的
for ($i = 1, $j = 1; $i <= 10,$j <= 11; print $i,print $j,print '<br/>',$i++,$j++);//循环11次
for ($i = 1, $j = 1; $i <= 11,$j <= 10; print $i,print $j,print '<br/>',$i++,$j++);//循环10次
/* example 3 */
for ($i = 1, $j = 6; $i <= 12,$j <= 11; print '$i=>'.$i.PHP_EOL,++$i,++$j)://用echo会报错
echo '$j=>'.$j."<br/>";
if($i>$j){
break;
}
++$i;
endfor;
?>
字母循环
<?php
for($i = 'Y'; $i != 'AD'; ++$i) {
echo $i.PHP_EOL;
}
//note: can't use $i< 'AD'.
//output: Y Z AA AB AC
<?php
//遍历日历
for ($date = strtotime("2018-02-01"); $date < strtotime("2018-03-01"); $date = strtotime("+1 day", $date)) {
echo date("Y-m-d", $date)."<br />";
}
?>
foreach
foreach 不支持用“@”来抑制错误信息的能力。
数组最后一个元素的 $val 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
<?php
$arr1 = array("a" => 1, "b" => 2, "c" => 3);
$arr2 = array("x" => 4, "y" => 5, "z" => 6);
foreach ($arr1 as $key => &$val) {}
foreach ($arr2 as $key => $val) {}
var_dump($arr1);
var_dump($arr2);
?>
用 list() 给嵌套的数组解包
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
// $a contains the first element of the nested array,
// and $b contains the second element.
echo "A: $a; B: $b\n";
}
//A: 1; B: 2
//A: 3; B: 4
?>
break
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<br />\n";
}
/* 使用可选参数 */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br />\n";
break 1; /* 只退出 switch. */
case 10:
echo "At 10; quitting<br />\n";
break 2; /* 退出 switch 和 while 循环 */
default:
break;
}
}
?>
<?php
break(2);
break 2; //same result
?>
break 的更新记录
5.4.0 break 0; 不再合法。这在之前的版本被解析为 break 1;。
5.4.0 取消变量作为参数传递(例如 $num = 2; break $num;)。
continue
接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是 1,即跳到当前循环末尾。
省略 continue 后面的分号会导致混淆。
continue 的更新记录
5.4.0 qcontinue 0; 不再合法。这在之前的版本被解析为 continue 1;。
5.4.0 取消变量作为参数传递(例如 $num = 2; continue $num;)。
switch 语句
类似于具有同一个表达式的一系列 if 语句。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码
switch/case 作的是松散比较。(即==比较,严格比较为===)
switch 语句一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个 case 语句中的值和 switch 表达式的值匹配时 PHP 才开始执行语句,直到 switch 的程序段结束或者遇到第一个 break 语句为止。如果不在 case 的语句段最后写上 break 的话,PHP 将继续执行下一个 case 中的语句段。
在 switch 语句中条件只求值一次并用来和每个 case 语句比较。在 elseif 语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用 switch 语句可能会快一些。
在一个 case 中的语句也可以为空,这样只不过将控制转移到了下一个 case 中的语句。
case 表达式可以是任何求值为简单类型的表达式,即整型或浮点数以及字符串。不能用数组或对象,除非它们被解除引用成为简单类型。
switch 支持替代语法的流程控制。
<?php
switch ($i):
case 0:
echo "i";
break;
case 1:
default:
echo "i";
endswitch;
?>
允许使用分号代替 case 语句后的冒号
<?php
switch($beer)
{
case 'heineken';
echo '2';
break;
default;
echo '3';
break;
}
?>
<?php
$a = 0;
if(++$a == 3) echo 3;
elseif(++$a == 2) echo 2;
elseif(++$a == 1) echo 1;
else echo "No match!";
// Outputs: 2
$a = 0;
switch(++$a) {
case 3: echo 3; break;
case 2: echo 2; break;
case 1: echo 1; break;
default: echo "No match!"; break;
}
// Outputs: 1
?>
PHP之友评论