【PHP】do-while文 - 反復処理 / 1度は必ず繰り返し処理を実行する処理

【PHP】do-while文 - 反復処理 / 1度は必ず繰り返し処理を実行する処理

同じ処理を繰り返すことを“反復処理”と呼びますが、PHPはfor文やwhile文の他にdo-while文を使ってその処理を実現することができます。

do-while文はfor文やwhile文などの一般的な反復処理と比べ処理の順序に違いがあります。

ここではdo-while文ついて解説します。

検証環境

do-while文

do-while文は“1度は必ず繰り返し処理を実行する反復処理”の構文です。

while文と似ていますが、繰り返しの継続判定を行うタイミングが異なります。

基本構文

do {
    処理
} while( 条件式 );

while文と同様に条件式処理の項目をプログラムに合わせて記述します。

処理の流れ

do-while文の処理の流れを以下に示します。

  1. ブロック(波括弧{}内)の処理を実行
  2. 条件式を実行
  3. 条件式の結果がfalseの場合は終了
  4. 1に戻る

while文に比べて繰り返しの継続判定よりも先に、ブロックの処理を実行するため、1度は必ず繰り返されます。

サンプル

<?php

$num = 1;

___ih_hl_start
do {
    $num = $num * 2;
    echo '[ $num ] '.$num."\n";
} while( $num < 30 );
___ih_hl_end

?>
$ php sample1.php
[ $num ] 2
[ $num ] 4
[ $num ] 8
[ $num ] 16
[ $num ] 32

2の累乗が“30を超えるまで”出力するプログラムです。

条件式は$num < 30です。

繰り返しごとに$num = $num * 2によって$numの値を変更し、5回目で32となり、条件式がfalseになるため、while文を終了します。

while文との比較

while文とdo-while文の違いは『繰り返す処理を必ず1度実行するかどうか』です。

例えば、次のwhile文のコードは繰り返しを1度も実行しません。

<?php

$num = 1;

while( $num < 0 ) {
    $num = $num * 2;
    echo '[ $num ] '.$num."\n";
}

?>
$ php sample2.php
$

初めに継続判定しますが、$num < 0$num1のためfalseとなり、1度も実行せずに終了します。

条件式と繰り返し処理を変えずにdo-while文に書き換えると次のようになります。

<?php

$num = 1;

___ih_hl_start
do {
    $num = $num * 2;
    echo '[ $num ] '.$num."\n";
} while( $num < 0 );
___ih_hl_end

?>
$ php sample3.php
[ $num ] 2

実行結果から繰り返し処理を1回だけ実行していることがわかります。

繰り返しの継続判定よりも先に繰り返し処理を実行するため、このような結果になります。

演習問題

問題1

1からコマンドライン引数で与えた数値までの合計値を計算するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • do-while文を使って合計値を計算する
$ php practice.php 27
total : 378

問題2

0からコマンドライン引数で与えた数値まで偶数の合計値を計算するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • do-while文を使って合計値を計算する
$ php practice.php 100
total : 2550

問題3

九九を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • do-while文を使う。
-- 1の段 --
1 × 1 = 1
1 × 2 = 2
1 × 3 = 3
1 × 4 = 4
1 × 5 = 5
1 × 6 = 6
1 × 7 = 7
1 × 8 = 8
1 × 9 = 9

-- 2の段 --
2 × 1 = 2
2 × 2 = 4
2 × 3 = 6
2 × 4 = 8
2 × 5 = 10
2 × 6 = 12
2 × 7 = 14
2 × 8 = 16
2 × 9 = 18

-- 3の段 --
3 × 1 = 3
3 × 2 = 6
3 × 3 = 9
3 × 4 = 12
3 × 5 = 15
3 × 6 = 18
3 × 7 = 21
3 × 8 = 24
3 × 9 = 27

-- 4の段 --
4 × 1 = 4
4 × 2 = 8
4 × 3 = 12
4 × 4 = 16
4 × 5 = 20
4 × 6 = 24
4 × 7 = 28
4 × 8 = 32
4 × 9 = 36

-- 5の段 --
5 × 1 = 5
5 × 2 = 10
5 × 3 = 15
5 × 4 = 20
5 × 5 = 25
5 × 6 = 30
5 × 7 = 35
5 × 8 = 40
5 × 9 = 45

-- 6の段 --
6 × 1 = 6
6 × 2 = 12
6 × 3 = 18
6 × 4 = 24
6 × 5 = 30
6 × 6 = 36
6 × 7 = 42
6 × 8 = 48
6 × 9 = 54

-- 7の段 --
7 × 1 = 7
7 × 2 = 14
7 × 3 = 21
7 × 4 = 28
7 × 5 = 35
7 × 6 = 42
7 × 7 = 49
7 × 8 = 56
7 × 9 = 63

-- 8の段 --
8 × 1 = 8
8 × 2 = 16
8 × 3 = 24
8 × 4 = 32
8 × 5 = 40
8 × 6 = 48
8 × 7 = 56
8 × 8 = 64
8 × 9 = 72

-- 9の段 --
9 × 1 = 9
9 × 2 = 18
9 × 3 = 27
9 × 4 = 36
9 × 5 = 45
9 × 6 = 54
9 × 7 = 63
9 × 8 = 72
9 × 9 = 81