cncml手绘网
标题: PHP跳出循环的方法及continue、break、exit的区别 [打印本页]
作者: admin 时间: 2019-4-11 11:13
标题: PHP跳出循环的方法及continue、break、exit的区别
PHP中的循环结构大致有for循环,while循环,do{} while 循环以及foreach循环几种,不管哪种循环中,在PHP中跳出循环大致有这么几种方式:/ P/ |1 o0 c- U3 W
- <?php
0 s2 |1 n- t7 o1 V# A% j -
) z' u" T0 P: _+ h B4 T8 p - $i = 1;
- r& N! a* p g - while (true) { // 这里看上去这个循环会一直执行
& y1 O# M+ Z6 i( N# F; f" M& M# H - if ($i==2){// 2跳过不显示7 n% n7 Q1 q$ s, ~
- $i++;
' z0 J& Y- F! j9 q! D. M6 Q' ] - continue;
; U9 W, R; I* t. b0 t - } else if($i==5) {// 但到这里$i=5就跳出循循环了
; z( {8 S. W( o - break;2 W2 l$ A6 \, A$ ^6 _
- } else{
' l6 W1 F0 I6 ]! G2 h - echo $i . '<br>';4 Q' L. p$ A" V c+ }" f8 N
- }3 v7 f+ D2 u( V( B* A) `
- $i++;
/ Y3 X# K P; c2 N - }1 w1 q& ]. G" w& N+ `7 J" D
- exit;
- S: L& v7 h1 g0 k0 N* s: g -
9 {3 a; f: }1 Q% ]6 y7 @9 J7 Z - echo'这里不输出';
" J9 I# s' H$ [/ p5 R. s* Q - ?>
7 k3 _6 t7 k$ o/ L - % c$ k, _, S! K8 E8 o. C( P B
- 结果:' Z# j( ^, _ ]' g0 b- l
- # S0 A. `( u7 x4 M- z$ A! W2 T& C: ^
- 1
" ~6 ~9 h6 r$ v - 3
8 H! M6 `/ }8 m; a - 4
复制代码 continue3 S3 v$ j3 D3 S% M
continue是用来用在循环结构中,控制程序放弃本次循环continue语句之后的代码并转而进行下一次循环。continue本身并不跳出循环结构,只是放弃这一次循环。如果在非循环结构中(例如if语句中,switch语句中)使用continue,程序将会出错。
例如在下面的这段PHP代码片段中:
- <?php+ _) y: o+ r: N
- for($i = 1;$i <= 100; $i++ ){
8 X; b3 p% m* {+ ^# r& @ - if($i % 3 == 0 || $i % 7 == 0){
/ A( j% x" S( k - continue;
: J' C# G4 d- V2 ?1 Y$ n - }" H2 \ G/ Q- J7 P
- & #160; else{2 F$ |6 Y( a* W" q- p0 ~% p
- echo”$i \n<br/>”;
" Y* s8 ]! i) q) C, O - }* d+ N7 l$ a3 }+ \
- }
8 X6 b) ^# s! }$ ` - ?>
复制代码PHP的代码片段的作用是输出100以内,既不能被7整除又不能被3整除的那些自然数,循环中先用if条件语句判断那些能被整除的数,然后执行continue;语句,就直接进入了下个循环。不会执行下面的输出语句了。
break
break是被用在上面所提的各种循环和switch语句中的。他的作用是跳出当前的语法结构,执行下面的语句。break语句可以带一个参数n,表示跳出循环的层数,如果要跳出多重循环的话,可以用n来表示跳出的层数,如果不带参数默认是跳出本重循环。
看下面这个多重循环嵌套的例子:
- for($i = 1;$i <= 10; $i++ ){
3 @* B+ a7 Z8 L* ~( ?4 Y& K - for($j = 1;$j <= 10;$j++){, G' h4 q! m; P c6 f) U5 K& I" `
- $m = $i * $i + $j * $j;# a% Z5 W4 q# w! i. {
- echo”$m \n<br/>”;
! ]6 a9 I2 V' M0 W9 ^ - if($m < 90 || $m > 190) {
3 f4 ]' h, Z4 r) \: x" X. ]! N - break 2;
" C `" g1 Y6 ^* B: P3 G - }; h" a7 J5 t* U. \ N
- }# \+ d6 P( d2 x
- }
复制代码这里使用了break2跳出了两重循环,你可以试验一眼,将2去掉,得到的结果是完全不一样的。如果不使用参数,跳出的只是本次循环,第一层循环会继续执行下去。
goto
goto实际上只是一个运算符,和其他语言一样,PHP中也不鼓励滥用goto,滥用goto会导致程序的可读性严重下降。goto的作用是将程序的执行从当前位置跳转到其他任意位置,goto本身并没有要结束的循环的作用,但其跳转位置的作用使得其可以作为跳出循环使用。但PHP5.3及以上版本停止了对goto的支持,所以应该尽量避免使用goto。
# z" ^- Y! n, J' l# m- z下面的是一个使用了goto跳出循环的例子
- for($i = 1000;$i >= 1 ; $i– ){) j0 F& S3 U* ?; @4 I2 a* ]
- if( sqrt($i) <= 29){
. Q7 E, C6 |- I' Q/ A$ u - goto a;. A. @" {. e) z0 l! a
- }6 j1 \- F& _0 V% x4 p1 V
- echo “$i”;
3 P4 i h; R3 H9 I, o - }4 c$ l1 C; \* Y0 T7 W
- a:
& H9 ~, W+ [( _ - echo” this is the end”;
复制代码例子中使用了goto来跳出循环,这个例子用来检测1000以内,那些数的平方根大于29。
exit
exit是用来结束程序执行的。可以用在任何地方,本身没有跳出循环的含义。exit可以带一个参数,如果参数是字符串,PHP将会直接把字符串输出,如果参数是integer整形(范围是0-254),那个参数将会被作为结束状态使用。
- <?php
8 ?& Z; a2 S l: v - for($i = 1000;$i >= 1 ; $i– ){! o9 B# `" h. c- c6 b! ]0 m
- if( sqrt($i) >= 29){) ^* ~0 q v' S: {" j* K
- echo”$i \n<br/>”;3 w3 O& w: ]! E# |4 y
- }2 D$ [/ ]7 @1 ^7 b0 R) q9 f
- else{
6 q! v* r3 q* n3 D M - exit;( i+ {% U$ z8 M- w" w# ]" K
- }9 d: _7 L Q8 l6 H' ^' H
- }
$ W. |8 Z, B, N - echo”本行将不会被输出”;
9 f! [6 K/ A) Y7 I - ?>
复制代码上面这个例子中直接在从循环里结束了代码的运行,这样会导致后面的代码都不会被执行,如果是在一个php web页面里面,甚至连exit后面的html代码都不会被输出。
return
return语句是用来结束一段代码,并返回一个参数的。可以从一个函数里调用,也可以从一个include()或者require()语句包含的文件里来调用,也可以是在主程序里调用,如果是在函数里调用程序将会马上结束运行并返回参数,如果是include()或者require()语句包含的文件中被调用,程序执行将会马上返回到调用该文件的程序,而返回值将作为include()或者require()的返回值。而如果是在主程序中调用,那么主程序将会马上停止执行
- <?php
9 r& e: k$ G7 X6 u% K' c2 O - for($i = 1000;$i >= 1 ; $i– ){
/ G4 B4 L, w+ }& i2 @4 [2 A% ] - if( sqrt($i) >= 29){
& |; r* D: m8 J - echo”$i \n<br/>”;! N+ l7 j( @2 p: C& B! ~
- }
1 z' Q& a9 N R5 X% R( a - else{4 h( C" g- L# Z& Y* r# V H# O
- return;
# x5 ^9 G( _, y - }! @. n" b. m8 @- M
- }
3 `- `# h, @1 V, v% R. b - echo”本行将不会被输出”;5 s$ h* M) B" C; n4 w0 V: R( W
- ?>
复制代码这里的例子和上面使用exit的效果是一样的。
在循环结束条件,自然跳出
这个当然是最好理解了,当循环满足循环临界条件时就是自己退出。
以上是PHP中跳出循环的几种方式的简单总结。
if不是循环结构,所以不能使用break,continue退出。如果你非要在if语句中这样用的话,可以把这个if语句放在一个循环结构中
- $i=0;
, ?4 F8 y/ N0 J7 E# }% j - $s=1;! w: v; i/ y9 Z9 E$ ~4 z, d9 C
- while($i==0)
2 r$ c: A6 E! }! Q* V- G - {
" ~9 J x* R3 E" x s: u' x - if($s==1)
' A! j3 y. z( f% r9 [' V& [ - {
0 b3 r) c; z9 u1 u - $v=8;- k& \4 e0 F, j: w
- break;
* F- ?6 B. }4 L! \ U; d - }
- I1 u4 q! J% N3 ], Y+ C8 [2 c - $v=9;
& j9 x `# [- Z1 Q4 h: t5 X* R' N - }
3 N- d' [; L6 X* }4 X -
K8 r, ]: p/ F - echo $v;
复制代码 + M' Z- }" `! M
$ i0 z. _6 m7 R! S1 C
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |