While loops don't require a code block (statement).
<?php
while( ++$i < 10 ); // look ma, no brackets!
echo $i; // 10
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
while
循环是 PHP 中最简单的循环类型。它和
C 语言中的 while
表现地一样。while
语句的基本格式是:
while (expr) statement
while
语句的含意很简单,它告诉 PHP 只要
while
表达式的值为 true
就重复执行嵌套中的循环语句。表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行,直到本次循环结束。
如果 while
表达式的值一开始就是 false
,则循环语句一次都不会执行。
和 if
语句一样,可以在 while
循环中用花括号括起一个语句组,或者用替代语法:
while (expr): statement ... endwhile;
下面两个例子完全一样,都显示数字 1 到 10:
<?php
/* 示例 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* 在自增前(后自增)打印的值将会是 $i */
}
/* 示例 2 */
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
?>
While loops don't require a code block (statement).
<?php
while( ++$i < 10 ); // look ma, no brackets!
echo $i; // 10
?>
The example below displays the numbers from 1 to 5:
<?php
$x = 1;
while($x <= 5) {
echo "The number is: $x <br>";
$x++;
}
?>
This example counts to 100 by tens:
<?php
$x = 0;
while($x <= 100) {
echo "The number is: $x <br>";
$x+=10;
}
?>
<?php
$i = -1;
while ($i) {
echo $i++;
}
?>
outputs "-1" then stops because "0" (zero) gets evaluated as FALSE.
this demonstrates why it's important for a PDO statement fetch-ing a column value inside a while-loop to test explicitly for FALSE.
simple pyramid pattern program using while loop
<?php
$i=1;
while($i<=5)
{
$j=1;
while($j<=$i)
{
echo"*  ";
$j++;
}
echo"<br>";
$i++;
}
?>
// or alternatively you can use:
<?php
$i=1;
while($i<=5):
$j=1;
while($j<=$i):
echo"*  ";
$j++;
endwhile;
echo"<br>";
$i++;
endwhile;
?>
Just a note about using the continue statement to forego the remainder of a loop - be SURE you're not issuing the continue statement from within a SWITCH case - doing so will not continue the while loop, but rather the switch statement itself.
While that may seem obvious to some, it took a little bit of testing for me, so hopefully this helps someone else.
I find it often clearer to set a simple flag ($finished) to false at the start of the loop, and have the program set it to true when it's finished doing whatever it's trying to do. Then the code is more self-documenting: WHILE NOT FINISHED keep going through the loop. FINISHED EQUALS TRUE when you're done. Here's an example. This is the code I use to generate a random filename and ensure that there is not already an existing file with the same name. I've added very verbose comments to it to make it clear how it works:
<?php
$finaldir = 'download';
$finished = false; // we're not finished yet (we just started)
while ( ! $finished ): // while not finished
$rn = rand(); // random number
$outfile = $finaldir.'/'.$rn.'.gif'; // output file name
if ( ! file_exists($outfile) ): // if file DOES NOT exist...
$finished = true; // ...we are finished
endif;
endwhile; // (if not finished, re-start WHILE loop)
?>
At the end of the while (list / each) loop the array pointer will be at the end.
This means the second while loop on that array will be skipped!
You can put the array pointer back with the reset($myArray) function.
example:
<?php
$myArray=array('aa','bb','cc','dd');
while (list ($key, $val) = each ($myArray) ) echo $val;
reset($myArray);
while (list ($key, $val) = each ($myArray) ) echo $val;
?>
<?php
// test While Vs For php 5.6.17
$t1 = microtime(true);
$a=0;
while($a++ <= 1000000000);
$t2 = microtime(true);
$x1 = $t2 - $t1;
echo PHP_EOL,' > while($a++ <= 100000000); : ' ,$x1, 's', PHP_EOL;
$t3 = microtime(true);
for($a=0;$a <= 1000000000;$a++);
$t4 = microtime(true);
$x2 = $t4 - $t3;
echo PHP_EOL,'> for($a=0;$a <= 100000000;$a++); : ' ,$x2, 's', PHP_EOL;
$t5 = microtime(true);
$a=0; for(;$a++ <= 1000000000;);
$t6 = microtime(true);
$x3 = $t6 - $t5;
echo PHP_EOL,' > $a=0; for(;$a++ <= 100000000;); : ' , $x3, 's', PHP_EOL;
//> while($a++ <= 100000000); = 18.509671926498s
//
//> for($a=0;$a <= 100000000;$a++); = 25.450572013855s
//
//> $a=0; for(;$a++ <= 100000000;); = 22.614907979965s
// ===================
//> while($a++ != 100000000); : 18.204656839371s
//
//> for($a=0;$a != 100000000;$a++); : 25.025605201721s
//
//> $a=0; for(;$a++ != 100000000;); : 22.340576887131s
// ===================
//> while($a++ < 100000000); : 18.383454084396s
//
//> for($a=0;$a < 100000000;$a++); : 25.290743112564s
//
//> $a=0; for(;$a++ < 100000000;); : 23.28609919548s
?>
Instead of this usage;
<?php
$arr = array("orange", "banana", "apple", "raspberry");
$i = 0;
while ($i < count($arr)) {
$a = $arr[$i];
echo $a ."\n";
$i++;
}
// or
$i = 0;
$c = count($arr);
while ($i < $c) {
$a = $arr[$i];
echo $a ."\n";
$i++;
}
?>
This could be more efficient;
<?php
while ($a = $arr[1 * $i++]) echo $a ."\n";
?>