while文、do-while文、(条件が満たされている間は繰り返す)

同じ条件を繰り返す構文は色々あるけど、最終的な目的を果たすためにどの構文を利用するかを考えることは大切だと思います。
その中で今回は「while文」と「do-while文」についてまとめてみたいと思います。

##while文を使ったループ処理
while文は、まず「条件式のチェック」を行います。条件が満たされていれば「処理」を行います。処理が終わったら再び「条件式のチェック」を行います。条件が満たされていれば、また「処理」を行います。これを続けて最終的に「条件が満たされなくなった」らwhile文を抜けます。

###実際の書式

```php:while文
while(条件式){
	処理
}
```
ここで出てくる条件式はif文の時と同じように、値がtrue(真)かfalse(偽)の論理値(boolean)になる式を書きます。

上記の書式構文の説明だけだとイメージが沸きずらいとおもうので以下↓図にしてみました。
<br>


![WHILE文図.png](https://qiita-image-store.s3.amazonaws.com/0/35975/c1197a73-697e-1bb7-c1c5-5cbfe49a4f93.png "WHILE文図.png")

##while文を使った例文

これから上記の様な構文を作ろうと思うのですが、作るにあたって「配列」が出てくるのでその「配列」について少々説明しておきたいと思います。
####----配列について-----------------------------------------
配列とは「複数の値を入れておくことができるロッカーの様なもの」です。例えば以下の構文の場合「$name」という変数に6個の値をそれぞれ別々に格納しているというイメージです。

```php:配列
<?php  

$name = array("ちよ", "榊","神楽","大阪","かおりん","よみ");

echo $name[0]; //配列の中の「0番目」を出力してくださいの意味

?>
```

```php:出力
ちよ
```

配列の「何番目」は「0」がスタートの値なので、この場合「0番目」に当たる一番最初の値は`ちよ`なので`ちよ`と出力されます。

今の例では文字列で行いましたが、「array()」の値は数値でも構いません。

####----今回の構文で登場する関数のまとめ------------------------------
①配列関数

| 関数名      |例| 説明 |
|:-----------:|:------------:|:------------:|
|    `count()`       |    `cout($numArray)`    |   配列「$numArray」に入ってる値の個数を調べる    |
| 	 `in_array()`     |     `in_array($a,$b)`    |   配列`$b`の中に「変数`$a`」が含まれているかどうか調べる    |
| 	 `array_push()`     |     `array_push($a,$b)`    |   配列`$a`の最後に「変数`$b`」という要素を追加する   |

②その他

| 関数名      |例| 説明 |
|:-----------:|:------------:|:------------:|
|    `mt_rand()`       |    `mt_rand(1,50)`    |   1〜50の範囲内で無作為に数値を1つ生成する(乱数を生成する)    |


#例題 :「配列の値が5個になるまで繰り返す!」
これから例題として以下の様な構文を作ろうと思います。↓

```php:例題
whileの繰り返し処理で毎回1〜50までの数値の中から1つ選んで配列「$numArray」に追加していきます。処理する前に配列の値の個数をチェックして、5個になったらwhileを抜けて繰り返しを終了します。

ただし最終的に配列「$numArray」に追加された数値の値は5つとも別の値でなくてはならない(同じ値が重複しない)という条件つきになります。
```

そうするとこれに見合う構文は以下の様になります。

```php:php
<?php
$numArray = array();  //まず空の配列を作る。

while (count($numArray) < 5) {  //条件式＝配列$numArrayの値が5個になるまで繰り返す
	   $num = mt_rand(1,50);  //1〜50のなかで乱数を1個作る
	   if (! in_array($num, $numArray)) {  //もし配列$numArrayの中に$numの値が「含まれていないなら」(`!`がついているので「否定」の意味になります)
	　 array_push($numArray, $num); //$num(乱数で選ばれた値)を配列$numArrayの最後に追加します。
	}
}

print_r($numArray);  //5個の数値が入った配列を確認する。
?>
```

```php:出力
Array ( [0] => 4 [1] => 17 [2] => 33 [3] => 43 [4] => 12 ) 
```



<br>
##do-while文を使ったループ処理

do-while文は、「まず処理を行った後で条件チェックを行い、条件が満たされていれば繰り返して処理する」というループ処理です。書式は以下になります。

```php:do-whileの書式
do {
	処理
} while( 条件式 );
```

図で流れを説明すると以下の様な流れになります↓
<br>
![do-WHILE文図.png](https://qiita-image-store.s3.amazonaws.com/0/35975/28ff114d-2422-9890-cef0-5fd6c92bcb21.png "do-WHILE文図.png")


#例題 : 合計が21になる3個の変数が決まるまで繰り返す。
先に今回の構文を作るにあたって必要な制御構文の「break」について説明します。

####breakとは、、、

```
breakは、現在実行中の for, foreach, while, do-while, switch 構造の実行を終了します。 
```


では構文を以下に書きます。

```php:php
<?php  
do {
	// 変数に1〜13の乱数を入れる
	$a = mt_rand(1,13);
	$b = mt_rand(1,13);
	$c = mt_rand(1,13);
	$abc = $a + $b + $c;
	// もし合計が21になったらdo-whileの実行自体を終了します。
	if ($abc == 21) {
		break;
	}
} while (TRUE);

echo "合計が21になる3個の数字。{$a},{$b},{$c}";

?>
```

```php:出力
合計が21になる3個の数字。10,8,3 
```

上から順に見ていくと「while(条件式)」の部分が`while(TRUE)`となっているところが気になります。
`while(TRUE)`は「また同じことを繰り返しなさい」の意味です。なので永遠に処理が繰り返されるわけですが、処理の中に以下の構文が入ってます。

```php:php
// もし合計が21になったらdo-whileの実行自体を終了します。
if ($abc == 21) {
        break;
    }
```

これが効いてるので何度も繰り返しているうちに

```php:php
$abc == 21
```

が処理中に成立した時点で`break`によって`do-while`の実行自体が終了させられます。


以上、while文、do-while文についてのまとめでした。