PHPでウェブの世界と繋がろう!
menu
ホーム > PHPの文法 > 6 制御文 > 6-8 do ~ while 文

6-8 do ~ while 文

Pocket

- 1 分ノート ! -

  • do~while文はループ処理を行う
    do
    	文
    while (式)
    
    
    //文が複数の場合「{ }(ブロック)」で括る
    do {
    	文
    	文
    	文
    } while (式)
    
  • do~while文では文が最低1回は実行される
  • do~while文の 式 の評価は各反復処理の最後に行われる
  • do~while文を入れ子にすることが出来る
  • キーワード「break」でループを終了させることが出来る
  • キーワード「continue」で以降の文を実行せず再びdo~while文の 式 の評価へ戻ることが出来る
  • ※文とはコードの記述単位の1つで、PHPの場合は「;(セミコロン)」で区切られるまでのコード

do~while文とは
POINT
  • do~while文はループ処理を行う
    do
    	文
    while (式)
    
    
    //文が複数の場合「{ }(ブロック)」で括る
    do {
    	文
    	文
    	文
    } while (式)
    
  • do~while文では文が最低1回は実行される
  • do~while文の 式 の評価は各反復処理の最後に行われる

do~while文はループ(反復)処理を表現する制御文です。

do~while文の構文は

do
	文
while (式)


//文が複数の場合「{ }(ブロック)」で括る
do {
	文
	文
	文
} while (式)

です。

do~while文では、最初に文が実行されます。式 の評価はループ(反復)の最後に行われます。従って文の実行が最低1回は保証されます。while文との違いは 式 の評価のタイミングです。while文の 式 の評価は各反復処理の開始時に行われますが、do~while文の 式 の評価は、各反復処理の最後に行われます。

以下の例ではdo~while文の 式 の評価は「FALSE(偽)」ですが、文は最低1回は実行されるので、

$i = 1;
do{
	$i++;
}while($i < 1);
echo $i;
&#91;/PHP&#93;

結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>2</strong>
</div>
となります。

最初に文が実行された後、<strong class="clrPp6">式 を評価</strong>し、結果が「<strong class="clrPp6">TRUE(真)</strong>」の場合に、もう1度文を実行し、<strong class="clrPp6"> 式 の評価</strong>を行います。まだ「<strong class="clrPp6">TRUE(真)</strong>」の場合は、<strong class="clrPp6">文を実行</strong>し、<strong class="clrPp6">再度 式 の評価</strong>を行います。式 の評価が「<strong class="clrPp6">FALSE(偽)</strong>」と評価された場合はループ処理は終了し<strong class="clrPp6">文は実行されません</strong>。

do~while文の 式 の結果は「<strong class="clrPp6">真(TURE)</strong>」と「<strong class="clrPp6">偽(FALSE)</strong>」の<strong class="clrPp6">論理型</strong>で得る必要があります。ですので、式 には「<strong class="clrPp6">比較演算子</strong>」や「<strong class="clrPp6">論理演算子</strong>」など使用するなどして論理値の<strong class="clrPp6">「真(TRUE)」「偽(FALSE)」の値を返す式</strong>を作ります。<a href="http://www.tryphp.net/2011/10/12/phpref-ronritype/">論理型についてはこちらを参照下さい。</a>

<strong class="clrPp6">文とはコードの記述単位の1つで、PHPの場合は「;(セミコロン)」で区切られるまでのコードです。</strong>

文が複数の場合は「<strong class="clrPp6">{ }(ブロック</strong>)」で括ります。if文などと同じです。




<div id="pageUpArea"><div id="pageUpLink"><a href="#mokuji">ページ内の目次へ</a></div></div>
<div style="clear:both"></div>
</div>

















<a name="2"></a>
<h5>簡単なdo~while文</h5>
<div id="txtBoxLms" class="txtM">

<div id="txtBoxLmnBgRed1Br1" style="margin:0 0 10px 0;">
<strong class="clrR2">POINT</strong>
<strong><ul>
<li>do~while文では文が<span class="clrPp6">最低1回は実行される</span></li>
</ul></strong>
</div>

以下の例では、do~while文の 式 の結果は「FALSE(偽)」ですが、文が最低1回は実行されるので「$i++」のインクリメントが1回実行されています。
[PHP ruler="true" toolbar="true"]
$i = 1;
do{
	$i++;
}while($i < 1);
echo $i;
&#91;/PHP&#93;
結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>2</strong>
</div>
となります。

<div id="pageUpArea"><div id="pageUpLink"><a href="#mokuji">ページ内の目次へ</a></div></div>
<div style="clear:both"></div>
</div>







<a name="3"></a>
<h5>do~while文の入れ子</h5>
<div id="txtBoxLms" class="txtM">

<div id="txtBoxLmnBgRed1Br1" style="margin:0 0 10px 0;">
<strong class="clrR2">POINT</strong>
<strong><ul>
<li>do~while文を<span class="clrPp6">入れ子にすることが出来る</span></li>
</ul></strong>
</div>

do~while文では、do~while文の中にdo~while文を記述する<strong class="clrPp6">入れ子(ネスト)</strong>が可能です。

[PHP ruler="true" toolbar="true"]
$i = 1;
do{
	echo $i;

	$j = 1;
	echo '(';
	do{
		echo $i.'-'.$j.',';
		$j++;
	}while($j <= 3);
	echo ')';

	echo "<br/>\n";
	$i++;
}while($i <= 10);
&#91;/PHP&#93;
結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>1(1-1,1-2,1-3,)
2(2-1,2-2,2-3,)
3(3-1,3-2,3-3,)
4(4-1,4-2,4-3,)
5(5-1,5-2,5-3,)
6(6-1,6-2,6-3,)
7(7-1,7-2,7-3,)
8(8-1,8-2,8-3,)
9(9-1,9-2,9-3,)
10(10-1,10-2,10-3,)</strong>
</div>
となります。


<div id="pageUpArea"><div id="pageUpLink"><a href="#mokuji">ページ内の目次へ</a></div></div>
<div style="clear:both"></div>
</div>








<a name="4"></a>
<h5>キーワード「break」を使用してdo~while文のループを終了させる</h5>
<div id="txtBoxLms" class="txtM">

<div id="txtBoxLmnBgRed1Br1" style="margin:0 0 10px 0;">
<strong class="clrR2">POINT</strong>
<strong><ul>
<li>キーワード「<span class="clrPp6">break</span>」でループを終了させることが出来る</li>
</ul></strong>
</div>

do~while文ではキーワード「<strong class="clrPp6">break</strong>」を使用してdo~while文のループを終了させることが出来ます。「break」が出てきた時点で、文の実行が終了しループ処理を抜け出します。

以下の例文ではif文でキーワード「break」を配置し、文の実行を終了させループ処理を抜け出しています。
[PHP ruler="true" toolbar="true"]
$i = 1;
do{
	if($i === 5)
	break;//ループ終了

	echo $i."<br/>\n";
	$i++;
}while($i <= 10);
&#91;/PHP&#93;
結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>1
2
3
4</strong>
</div>
となります。


<div id="pageUpArea"><div id="pageUpLink"><a href="#mokuji">ページ内の目次へ</a></div></div>
<div style="clear:both"></div>
</div>









<a name="5"></a>
<h5>キーワード「break」のオプションを使用</h5>
<div id="txtBoxLms" class="txtM">

キーワード「break」はループを終了させる機能がありますが、do~while文が入れ子(ネスト)構造であった場合に、<strong class="clrPp6">何段階のループを抜けるかを数字で指定</strong>することが出来ます。これは、キーワード「break」のオプション機能です。

[PHP ruler="true" toolbar="true"]
$i = 1;
$j = 1;
do{
	do{
		if($j === 5)
		break 2;//2段階のループから抜ける
		$j++;
	}while($j <= 10);
	$i++;
}while($i <= 10);
echo '$iは'.$i;
echo '<br/>';
echo '$jは'.$j;

結果は

$iは1
$jは5

となります。

例文では「break 2;」と指定して、ループ構造を2段階抜けています。$jが5まで加算された時点で「break」が実行され、ループ処理を2段階抜けるので、すべてのループから抜けることになります。従って$iは加算されずにループ処理を終了しています。

キーワード「continue」で 式 の評価に進む
POINT
  • キーワード「continue」で以降の文を実行せず再びdo~while文の 式 の評価へ進むことが出来る

キーワード「continue」を使用して以降の文を実行せずdo~while文の 式 の評価へ進むことが出来ます。通常 do~while文の 文 の実行が最後まで終了してから、do~while文の 式 の評価へ移りますが、キーワード「continue」が出てきた時点で以降の文を実行せずに、式 の評価へ進みます。式 の評価後ループを再開します。

$i = 1;
do{
	if($i === 5){
		echo '5となりました。<br/>';
		$i++;
		continue;//while(式)の評価へ移動
	}

	echo $i."<br/>\n";
	$i++;
}while($i <= 10);
&#91;/PHP&#93;
結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>1
2
3
4
5となりました。
6
7
8
9
10</strong>
</div>
となります。

キーワード「continue」もキーワード「break」ど同様に、オプションで何段階のループを抜けるか数字で指定できます。

以下の例文では、「$i === 5」の場合にif文で「continue 2」を実行し最初のdo~while文の 式 の評価へ進んでいます。
[PHP ruler="true" toolbar="true"]
$i = 1;
do{
	echo $i;
	$j = 1;
	echo '(';

	do{
		if($i === 5){
			echo ')';
			echo "<br/>\n";
			$i++;
			continue 2;
		}

		echo $i.'-'.$j.',';
		$j++;
	}while($j <= 3);

	echo ')';
	echo "<br/>\n";
	$i++;
}while($i <= 10);
&#91;/PHP&#93;
結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>1(1-1,1-2,1-3,)
2(2-1,2-2,2-3,)
3(3-1,3-2,3-3,)
4(4-1,4-2,4-3,)
5()
6(6-1,6-2,6-3,)
7(7-1,7-2,7-3,)
8(8-1,8-2,8-3,)
9(9-1,9-2,9-3,)
10(10-1,10-2,10-3,)
</strong>
</div>
となります。


<div id="pageUpArea"><div id="pageUpLink"><a href="#mokuji">ページ内の目次へ</a></div></div>
<div style="clear:both"></div>
</div>








<a name="7"></a>
<h5>サンプルコード</h5>
<div id="txtBoxLms" class="txtM">

<span id="txtSpl"><a href="http://www.tryphp.net/code-example/php/3-6-8.php" target="_blank"> - サンプル Click Here ! - </a></span>

[PHP ruler="true" toolbar="true"]
<h3>簡単なdo~while文</h3>
<?php
$i = 1;
do{
	$i++;
}while($i < 1);
echo $i;
?>

<h3>do~while文の入れ子</h3>
<?php
$i = 1;
do{
	echo $i;

	$j = 1;
	echo '(';
	do{
		echo $i.'-'.$j.',';
		$j++;
	}while($j <= 3);
	echo ')';

	echo "<br/>\n";
	$i++;
}while($i <= 10);
?>

<h3>キーワード「break」を使用してdo~while文のループを終了させる</h3>
<?php
$i = 1;
do{
	if($i === 5)
	break;//ループ終了

	echo $i."<br/>\n";
	$i++;
}while($i <= 10);
?>

<h3>キーワード「break」のオプションを使用</h3>
<?php
$i = 1;
$j = 1;
do{
	do{
		if($j === 5)
		break 2;//2段階のループから抜ける
		$j++;
	}while($j <= 10);
	$i++;
}while($i <= 10);
echo '$iは'.$i;
echo "<br/>\n";
echo '$jは'.$j;
?>

<h3>キーワード「continue」を使用して以降の文を実行せずwhile(式)の評価に戻る</h3>
<?php
$i = 1;
do{
	if($i === 5){
		echo '5となりました。<br/>';
		$i++;
		continue;//while(式)の評価へ移動
	}

	echo $i."<br/>\n";
	$i++;
}while($i <= 10);
?>
実行結果
簡単なdo~while文
2

do~while文の入れ子
1(1-1,1-2,1-3,)
2(2-1,2-2,2-3,)
3(3-1,3-2,3-3,)
4(4-1,4-2,4-3,)
5(5-1,5-2,5-3,)
6(6-1,6-2,6-3,)
7(7-1,7-2,7-3,)
8(8-1,8-2,8-3,)
9(9-1,9-2,9-3,)
10(10-1,10-2,10-3,)

キーワード「break」を使用してdo~while文のループを終了させる
1
2
3
4

キーワード「break」のオプションを使用
$iは1
$jは5

キーワード「continue」を使用して以降の文を実行せずwhile(式)の評価に戻る
1
2
3
4
5となりました。
6
7
8
9
10

– サンプル Click Here ! –


タグ(=記事関連ワード)

日付

投稿日:2011年11月6日
最終更新日:2014年02月20日

関連記事

配列関数サンプル

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://www.tryphp.net/phpref-structures_dowhile/trackback/