PHP头条
热点:

【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
?>

www.phpzy.comtrue/php/3207.htmlTechArticle【php手册:流程控制】流程控制的替代语法,while,do...while,for,foreach,break,continue,do...whileforeach PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。 替代语法...

相关文章

    暂无相关文章
相关频道:

PHP之友评论

今天推荐