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 (式) 文
while
文の意味は簡単です。
while
文は、式の値がtrue
である間、
入れ子の文を繰り返し実行することをPHPに指示します。
式の値は各反復処理の開始時にチェックされるので、ループ内の文の実行により
この値が変わった場合でもループ実行は各ループを終るまで終わりません。
(PHPによるループ内の文の実行が1回分の反復に相当します)
while
式の値がはじめからfalse
の
場合は、内部の文は一回も実行されません。
if
文と同様に、波括弧で複数の文を囲うか、
以下に示す別の構文を用いることにより、同じwhile
ループの中に複数の文をグループ化することができます。
while (式): 文 ... endwhile;
次の例は同じです。どちらも 1 から 10 までの数を出力します。
<?php
/* 例 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* 出力される値は、足される前の
$iの値です。
(後置加算) */
}
/* 例 2 */
$i = 1;
while ($i <= 10):
echo $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";
?>