【PHP】continue文 - 反復処理のスキップ(for/foreach/while/do-while)

【PHP】continue文 - 反復処理のスキップ(for/foreach/while/do-while)

反復処理で繰り返し中の残りの処理をスキップするcontinue文があります。

continue文はfor文やwhile文など特定の構文で使用可能です。

ここでは、continue文について解説します。

検証環境

continue文

continue文は反復処理の繰り返し中の残りの処理をスキップします。

特定構文(for文、foreach文、while文、do-while文など)の中で使用が可能で、continue文が実行されると一番近いブロック(波括弧{})の残りの処理をスキップします。

基本構文

continue;

構文はシンプルですが、特定構文の中でのみ利用でき、それ以外に記述するとエラーが発生します。

サンプル

continue文が使用できるfor文、foreach文、while文、do-while文について、各サンプルを示します。

for文

<?php

for( $i = 0; $i < 3; $i++ ) {
    echo $i."回目(前半)\n";
    if( $i == 1 ) {
        ___ih_hl_start
        continue;
        ___ih_hl_end
    }
    echo $i."回目(後半)\n";
}

?>
$ php sample1.php
0回目(前半)
0回目(後半)
1回目(前半)
2回目(前半)
2回目(後半)

このfor文は$i0~2の間、処理を繰り返します。

各繰り返しで前半と後半の2回出力しますが、$i1の時はcontinueが実行されるため、後半の出力はスキップされます。

foreach文

<?php

$fruits = [
    'Apple',
    'Orange',
    'Grape',
    'Melon',
];

foreach( $fruits as $data ) {
    if( $data == 'Grape' ) {
        ___ih_hl_start
        continue;
        ___ih_hl_end
    }
    echo $data."\n";
}

?>
$ php sample2.php
Apple
Orange
Melon

for文と同様に、continueを実行すると、以降の処理をスキップするため、'Grape'を取り出した回は出力の処理がスキップされます。

while文

<?php

$num = 1;

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

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

$i30以上になるまで繰り返すwhile文です。

繰り返しごとに$iは2の累乗され、その値を出力しますが、値が16の時にcontinueが実行されるため、その回の出力はスキップされています。

do-while文

<?php

$num = 1;

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

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

上記のwhile文のサンプル(sample3.php)をdo-while文で書き換えたソースコードです。

while文と同様に$num16のときにcontinueを実行するため、出力がスキップされています。

演習問題

問題1

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

  • for文を使う。
  • 4の数値を使う計算はスキップする
-- 1の段 --
1 × 1 = 1
1 × 2 = 2
1 × 3 = 3
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 × 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 × 5 = 15
3 × 6 = 18
3 × 7 = 21
3 × 8 = 24
3 × 9 = 27

-- 5の段 --
5 × 1 = 5
5 × 2 = 10
5 × 3 = 15
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 × 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 × 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 × 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 × 5 = 45
9 × 6 = 54
9 × 7 = 63
9 × 8 = 72
9 × 9 = 81

問題2

次の実行例になるような複数商品の合計料金を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 商品の料金は『単価×個数』とする
  • 商品名、単価、個数は標準入力で入力する
  • 商品名が空入力の場合、その商品入力をスキップする
    ※ 空入力 = 何も入力せずにEnterキーを押す
  • 単価、個数の入力値は整数型(interger)にキャストする
  • 商品入力の最後に継続可否を入力し、Yの場合は次の商品入力処理、Nの場合は終了する
$ php practice.php
<<<< 商品入力 >>>>
商品名 > 炭酸水
単価  > 150
個数  > 2
続けますか?(Y/N)> Y
商品名 > 
商品名 > 
商品名 > 弁当
単価  > 560
個数  > 2
続けますか?(Y/N)> Y
商品名 > お菓子
単価  > 300
個数  > 7
続けますか?(Y/N)> N

<<<<  会計  >>>>
---- 合計料金 ----
3520
----  明細  ----
商品名 : 炭酸水
単価  : 150
個数  : 2
.................
商品名 : 弁当
単価  : 560
個数  : 2
.................
商品名 : お菓子
単価  : 300
個数  : 7
.................
$ php practice.php
<<<< 商品入力 >>>>
商品名 > ローストビーフ
単価  > 1500
個数  > 2
続けますか?(Y/N)> y
続けますか?(Y/N)> x
続けますか?(Y/N)> a
続けますか?(Y/N)> Y
商品名 > ワイン
単価  > 500
個数  > 4
続けますか?(Y/N)> Y
商品名 > 牡蠣
単価  > 600
個数  > 8
続けますか?(Y/N)> n
続けますか?(Y/N)> x
続けますか?(Y/N)> N

<<<<  会計  >>>>
---- 合計料金 ----
9800
----  明細  ----
商品名 : ローストビーフ
単価  : 1500
個数  : 2
.................
商品名 : ワイン
単価  : 500
個数  : 4
.................
商品名 : 牡蠣
単価  : 600
個数  : 8
.................