PHP PHP入門講座 プログラミング

【PHPプログラミング入門講座】break

PHPプログラミングのキービジュアル

ブロック内の処理から脱出する命令

今回はPHPプログラムの「break」(ブレイクと読みます) について説明します。
breakは、以前の記事「【PHPプログラミング入門講座】条件分岐 (switch文)」に一度登場しました。

その記事では、次のようなサンプルプログラムについて説明しました。

<?php
  $ranking = 2;

  switch($ranking) {
    case 1:
      echo '金メダルです。';
      break;
    case 2:
      echo '銀メダルです。';
      break;
    case 3:
      echo '銅メダルです。';
      break;
    default:
      echo '表彰対象外です。';
  }

また、次のサンプルプログラムについても説明しました。

<?php
  $prefecture = '福岡県';

  switch($prefecture) {
    case '北海道':
      echo '北海道地方です。';
      break;
    case'青森県':
    case'岩手県':
    case'宮城県':
    case'秋田県':
    case'山形県':
    case'福島県':
      echo '東北地方です。';
      break;
    case '茨城県':
    case '栃木県':
    case '群馬県':
    case '埼玉県':
    case '千葉県':
    case '東京都':
    case '神奈川県':
      echo '関東地方です。';
      break;
    //※長いので途中省略
    default:
      echo '地方を判断できませんでした。';
  }

後者のサンプルプログラムは、caseに1つに対してbreakを1つ記述しない書き方です。
このことから、breakはswitch文の各caseの終了を表す命令ではないことが分かります。
そうではなく、breakはブロック内の処理から脱出するための命令です。

switch文以外でbreakを使う場合

先ほど「breakはブロック内の処理から脱出するための命令」であることを説明しました。
ということは、breakは他でもブロックを使う処理で使えるということです。
実際に、breakは、switch文、foreach文、for文、while文、do-while文で使うことができます。
switch文以外はループ処理です。
つまり、breakは「ループ処理を途中で脱出するための命令」としても使うことができます。

では、具体的にサンプルプログラムを書きながら、説明していきます。

foreach文でbreakを使った例

次のプログラムをforeach文を使って作ってみましょう。

フルーツ名のリストを前から順番に見ていき、その中に「バナナ」が存在したら「バナナ発見!<br>」と出力してください。
また、検索中は現在処理をしているフルーツ名を表示してください。

プログラムは次のようになります。

<?php
  $list = ['りんご', 'みかん', 'バナナ', 'メロン'];

  foreach($list as $name) {
    echo $name . '<br>';

    if($name === 'バナナ') {
      echo 'バナナ発見!<br>';
      break;
    }

  }

このプログラムの実行結果は、次の通りです。

りんご
みかん
バナナ
バナナ発見!

このプログラムの処理の流れを、図を使って説明します。

foreach文でbreakを使った処理の流れの説明図

図内の番号に対して説明します。

(1) 配列を変数$listに代入します。変数$listのデータ型は配列型になります。

(2) まず、foreachループに入るかどうかのチェックをします。
 配列に処理する要素がある場合は、最初の配列から順に変数$nameに代入してから、foreachブロック内の処理に進みます。
 もし、配列に処理する要素が無い場合(※注1)は、(8)→(9)の流れに進み、foreachの処理を終了します。

(3) 変数$nameの値と<br>を出力します。

(4) if文を使って変数$nameの値が「バナナ」に等しいかどうかをチェックしています。
 trueの場合は、ifブロックの中に処理が進みます。
 falseの場合は、ifブロックをスキップして(7)に進みます。

(5) 「バナナ発見!<br>」と出力します。

(6) breakにより、forブロックを脱出します。つまり、ここでループ処理が終了し、(9)次の処理に進み、foreachの処理を終了します。

(7) foreachブロックの最後に到達したら、再び(2)に戻ります。
 そして、(2)で配列$listの次の要素がある場合は、その要素を$nameに代入して再びforeachブロックの処理を実施します。
 もし、配列$listの次の要素が無い場合は、(8)→(9)の流れに進み、foreachの処理を終了します。

※注1:配列の要素が無い、つまり要素数がゼロの配列のことを「空配列」と呼びます。「 $list = [ ]; 」と書くと、配列$listは空配列になります。

for文でbreakを使った例

次のプログラムをfor文を使って作ってみましょう。

数字を1から10まで順に足していってください。
足し算をする度に「合計は**です。<br>」と出力してください。
もし、合計が20を超えた場合は、「20を超えました。<br>」と出力して、処理を終了してください。

プログラムは次のようになります。

<?php
  $total = 0;

  for($num = 1; $num <= 10; $num++) {
    $total += $num;
    echo '合計は' . $total . 'です。<br>';

    if($total >= 20) {
      echo '20を超えました。<br>';
      break;
    }

  }

このプログラムの実行結果は、次の通りです。

合計は1です。
合計は3です。
合計は6です。
合計は10です。
合計は15です。
合計は21です。
20を超えました。

このプログラムの処理の流れを、図を使って説明します。

for文でbreakを使った処理の流れの説明図

図内の番号に対して説明します。

(1) 合計の値を保持するための変数$totalを0で初期化します。

(2)「数字を1から10まで順に足してください。」より、for文の初期設定として変数$numに始まりの数字1を代入します。

(3)「数字を1から10まで順に足してください。」より、変数$numが10以下である間ループ処理が行われます。
 よって、for文の継続条件は「$num <= 10」です。

(4)「数字を1から10まで順に足してください。」より、変数$numはループ処理が行われるごとに1増加します。
 よって、for文の更新処理は「$num++」です。

(5) 数字を順に足していくので、合計$totalに対して$numを加算します。

(6)「足し算をする度に『合計は**です。』と出力してください。」の処理をしています。

(7)「合計が20を超えた場合は、」ということから、合計値を保持する変数$totalが20以上かどうかをif文で判定します。
 trueの場合はifブロックの処理に入ります。
 falseの場合はifブロックをスキップして(10)に進みます。

(8)「20を超えました。」と出力します。

(9) break命令があるため、for文から脱出し、(12)次の処理へ進みます。

(10) forブロックの最後に到達したら、forブロックの最初に戻ります。
 戻った時に、for文の(4)更新条件「$num++」で$numを1増加させて、(3)継続条件「$num <= 10」を満たしているか判定します。
 継続条件がtrueの場合は、再びforブロックの処理を実施します。
 falseの場合は(11)→(12)に進みfor文の処理を終了します。

while文でbreakを使った例

次のプログラムをwhile文を使って作ってみましょう。

18を繰り返し足していき、その合計が24で割り切れる最初の数字を発見してください。
探している間は「合計は**です。<br>」と出力してください。
発見した場合は、「**は24で割り切れます。<br>」と出力し、処理を終了してください。
なお、もし足していった合計が1,000を超えた場合は、処理を終了してください。

プログラムは次のようになります。

<?php
  $total = 0;

  while($total <= 1000) {
    $total += 18;
    echo '合計は' . $total . 'です。<br>';

    if($total % 24 == 0) {
      echo $total . 'は24で割り切れます。<br>';
      break;
    }

  }

「合計が24で割り切れる」とありますが、言い換えると「24で割ると余りが0」ということです。
この場合は、余りを計算する演算子「%」を使います
演算子「%」の説明は、以前の記事「【PHPプログラミング入門講座】PHPプログラムで計算をしてみよう」でしましたので、忘れた人は復習しておきましょう。

このプログラムの実行結果は、次の通りです。

合計は18です。
合計は36です。
合計は54です。
合計は72です。
72は24で割り切れます。

このプログラムの処理の流れを、図を使って説明します。

while文でbreakを使った処理の流れの説明図

(1) 合計の値を保持するための変数$totalを0で初期化します。

(2) while文の条件「$total <= 1000」を満たしているか判定します。
 trueの場合は、whileブロック内に入ります。
 falseの場合は、(9)→(10)の流れに進み、whileの処理を終了します。

(3) まず、0で初期化されている合計保持用の変数$totalに18を足します。
 $totalの値は18になります。

(4)「合計は**です。<br>」を出力します。
 1回目のwhileブロックの処理では、前述の実行結果で示した通り「合計は18です。」になります。

(5) if文の条件に「$total % 24 == 0」と書くことで$totalが24で割り切れるかをどうかを判定します。
 trueの場合は、24で割り切れるのでifブロック内に進みます。
 falseの場合は、24で割り切れないのでifブロックをスキップして(8)に進みます。
 このプログラムでは、24で割り切れるようになるまでは、判定結果がfalseの状態が続きます。
 ループ処理を繰り返し、24で割り切れたら、if文に入ります。

(6) 24で割り切れる数字を発見したので「**は24で割り切れます。」と出力します。

(7) 問題文より、24で割り切れたら処理を終了させるため、breakを書いてwhileループから脱出し、(10)の次の処理に進みます。

(8) whileブロックの最後に到達すると、whileブロックの最初に戻ります。
 この時に再びwhileの条件「$total <= 1000」の判定が行われます。
 trueの場合は、再びwhileブロック内の処理に進みます。
 falseの場合は(9)→(10)の流れでwhile文の処理を終了します。

do-while文でbreakを使った例

次のプログラムをdo-while文を使って作ってみましょう。

ランダムなアルファベットのリスト「O, R, V, I, N, U, M, X, C, G」の中で「N」は何番目に登場するか調べてください。
探している間は、現在処理中のアルファベットと改行<br>を出力してください。
発見した場合は、「Nは**番目に登場します。<br>」と出力し、処理を終了してください。
なお、アルファベットの数を超えた場合は、処理を終了してください。

プログラムは次のようになります。

<?php
  $list = ['O','R','V','I','N','U','M','X','C','G'];
  $i = 0;

  do {
    echo $list[$i] . '<br>';

    if($list[$i] === 'N') {
      $no = $i + 1;
      echo 'Nは' . $no . '番目に登場します。<br>';
      break;
    }

    $i++;
  } while( $i < count($list) );

このプログラムの実行結果は、次の通りです。

O
R
V
I
N
Nは5番目に登場します。

このプログラムの処理の流れを、図を使って説明します。

do-while文でbreakを使った処理の流れの説明図

(1) アルファベットのリストを変数$listに代入します。
 変数$listは配列型の変数になります。

(2) 配列のインデックス 番号として使用するための変数$iを0で初期化します。

(3) do-while文の処理に入ります。
 ここでは判定処理はありません。そのままdo-whileブロック内に入っていきます。

(4) 配列$list内のインデックス 番号が$iの要素を出力しています。
 最初は$iの値が0なので、$list[0]の値「O」(オー)が出力されます。

(5) $list[$i] (配列$listのインデックス 番号が$iの要素)の値が「N」に等しいか判定します。
 trueであれば、ifブロック内の処理に進みます。
 falseであれば、ifブロックをスキップして、(9)に進みます。
 つまり、「N」が見つかるまではこの条件判定はfalseであるため、ifブロックの処理はスキップされ続けます。

(6) 何番目を表す変数$noの値を求めています。
 配列のインデックス 番号は0から始まる数字であり、何番目は1から始まる数字であるため、
 配列のインデックス 番号を表す変数$iに1足した値が、変数$noの値になります。

(7)「Nは**番目に登場します。<br>」と出力します。

(8) breakにより、do-whileループを脱出し、(12)の次の処理に進みます。
 do-whileの処理はここで終了になります。

(9) インデックス 番号用変数$iを1つ増加させます。

(10) 最後に条件判断を行い、do-whileループ処理を継続するかどうか判定します。
 このプログラムのループ処理の継続条件は「 $i < count($list) 」つまり、インデックス 番号が配列の要素数よりも小さいかどうか判定しています。
 trueの場合は、(11)に進み、do-while文の最初に戻ります。
 falseの場合は、(12)に進み、do-while文を終了します。

おわりに

今回は「break」の使い方をサンプルプログラムと図を使って説明しました。
「break」は、switch文、foreach文、for文、while文、do-while文のブロック内から処理途中で脱出するための命令です。
処理の流れをきちんと理解することが重要です。
もし、分からなかった場合は、この記事に掲載した図と説明を何度も読み返しながら理解していきましょう。

PHPプログラミング入門講座 〜 全記事一覧 〜

-PHP, PHP入門講座, プログラミング
-, , , , , , , ,

Copyright© ハッピー・プログラミング・ライフ , 2020 All Rights Reserved.