PHP

第9章 while文

  1. 最終更新日:
  2. 公開日:

この章では、基本構文の1つである「while文」を学びます。while文はプログラミングにおいて欠かすことのできないループ(繰り返し)処理を行うためのものです。

基本的な使い方

while文の基本的な形は図1のようになります。

図1:

while文の基本的な形

まずはwhile()の中にある条件式を判定します。
そして、式が正しい(true)場合には{}に記述された処理を実行します。
ここまではif文と同じですね。

しかしwhile文はこの後にwhile()へ戻り、改めて条件式の判定を行います。
式が正しい(true)と判断したら再び{}の処理を実行し、また条件式を判定し...この流れを繰り返し、条件式が正しくない(false)となったときにwhile文によるループ処理が終了します。
何度も処理を繰り返すことから、これを「ループ処理」と言います。

注意しなければならないのは、条件式が正しい限り処理を延々と繰り返してしまうということです。
なので、while文の処理の中で条件式の値を更新していかないと、ずっと条件式が正しい(true)ままになってしまい無限ループにはまってしまいます。
したがって、プログラムを強制終了しない限り終わらせることができなくなり、サーバーのリソースを無駄にしてしまうので必ず避けなければなりません。

そのことを踏まえ、while文の条件式で判定する式や値は{}内の処理で更新するようにしてあげます。
次のコードを打って、実行してみてください。

PHP コード例

<?php
$index = 1;

while( $index < 10 ) {
  echo "<p>" . $index . "回目のループ</p>";
  $index++;
}

次のように出力されます。

実行結果

1回目のループ

2回目のループ

3回目のループ

4回目のループ

5回目のループ

6回目のループ

7回目のループ

8回目のループ

9回目のループ

このwhile文では$indexがループの鍵になっています。
1回目の条件式は「1 < 10」となるので正しい(true)判定となり{}内の処理を実行します。

処理はecho関数でテキストを出力した後に、$indexの値を1つ増やしています。
$indexの後ろについている「++」は、変数内の値を1つだけ増やしてくれる「加算子」と言うものです。
(もちろん、値を1つだけ減らす「減算子--もあります。)

echoに渡している「"<p>"」や「$index」の間に書かれている「.(ドット)」は、「結合演算子」です。
この演算子は「.」の左右にある文字列や変数を1つに連結することができます。

上のwhile文がループしていく中で、$indexの値は次のように増えていきます。

$indexの値の変化

1回目のループ  1 -> 2
2回目のループ  2 -> 3
3回目のループ  3 -> 4
4回目のループ  4 -> 5
5回目のループ  5 -> 6
6回目のループ  6 -> 7
7回目のループ  7 -> 8
8回目のループ  8 -> 9
9回目のループ  9 -> 10

9回目の処理で$indexは10になるため、10回目の条件式の判定で「10 < 10」が正しくない(false)となりwhile文によるループ処理が終了します。

実践的なwhile文の使い方

while文の流れを掴んだところで、次は少し実践的なコードを書いていきましょう。

第3章 配列」で、ECサイトの商品をイメージした2次元配列を作ったのを覚えているでしょうか。
今回はその配列を使って、商品の合計金額を計算してみます。
次のコードを打ち、実行してみてください。

PHP コード例

<?php
$sum = 0;
$index = 0;
$item = array();

$item[0] = array(
  "name" => "ジーンズ",
  "price" => 7980,
  "size" => "M"
);

$item[1] = array(
  "name" => "Tシャツ",
  "price" => 2980,
  "size" => "M"
);

$item[2] = array(
  "name" => "パーカー",
  "price" => 4400,
  "size" => "M"
);

while( isset($item[$index]) ) {
  
  $sum += $item[$index]["price"];
  $index++;
}

echo "合計金額:¥" . $sum;

うまく実行できると、3つの商品の合計金額が表示されます。

出力例

合計金額:¥15360

while文の中身を見ていきましょう。

まずは、条件式のisset($item[$index])です。
isset関数は引数で渡した変数が存在するものかをチェックします。
存在する場合は「true」を、存在しない場合は「false」を返します。

上のwhile文では1回目に$item[0]が存在するかを確認していることになります。
同じように、2回目は$item[1]が存在するか、3回目は$item[2]が存在するかと確認していき、4回目の$item[3]のところで存在しない判定(false)となりwhile文が終了します。

while文の中の$sum += $item[$index]["price"];は、代入演算子という「+=」を使って変数$sumへ商品の金額を足していっています。
この+=は、左側の$sumに入っている値へ、右側の$item[$index]["price"]を足すという処理をしています。

なのでコードとしては$sum = $sum + $item[$index]["price"];と書くのと全く同じですが、こちらの+=を使ったほうがシンプル書くことができて便利です。

while文を抜けたら、$sumへ足していった商品金額を出力して終了します。

while文の実践的なコードを書けるようになったところで、while文の姉妹的な存在である「do〜while文」も見てみましょう。

do〜while文

do〜while文while文と同じループ処理を行う基本構文です。
しかし、処理の流れが真逆になります。
while文は次のような流れで実行されていました。

  • (1) 条件式の判定
  • (2) {}内の処理を実行

対して、do〜while文は次のようになります。

  • (1) {}内の処理を実行
  • (2) 条件式の判定

言葉で説明するよりも実際の動きを見てしまった方が早いと思うので、次のコードを実行してみてください。

PHP コード例

<?php
$index = 1;

do {
  echo "<p>" . $index . "回目のループ</p>";
  $index++;

} while($index < 5);

「1回目ループ」〜「4回目のループ」まで出力されると思います。
実は、上記のコードだとwhile文で実行した場合と違いがありません。

そこで、8行目に書かれている条件式を$index < 1と変更し、再度実行してみてください。
「1回目のループ」だけ出力されるはずです。

while文で、同じ条件式を書いてみると次のようになります。

PHPコード例

<?php
$index = 1;

/* do〜while文をコメントアウト
do {
  echo "<p>" . $index . "回目のループ</p>";
  $index++;

} while($index < 1);
*/

while($index < 1) {
  echo "<p>" . $index . "回目のループ</p>";
  $index++;
}

実行しても何も出力されません。ここが、while文do〜while文の違いです。

while文」では最初に条件式を判定してから{}内の処理を実行しますが、「do〜while文」は{}内の処理を実行してから、条件式の判定を行います。
したがって、while文では1度も処理を実行しないことがあるのに対し、do〜while文は最低でも1度は処理を実行するということです。

補足ですが、do〜while文では条件式の後ろに「;」が付くことに注意してください。
細かいポイントですが、付け忘れてしまうと文法エラーになってしまいます。

まとめ

PHPの中で、最もシンプルなループ処理の基本構文であるwhile文を見てきました。次の章では、異なるループ処理の基本構文を学びます。

この章で学んだこと

  • ループ(繰り返し)処理を行いたいときはwhile文を使用する
  • 最低でも1度は処理を実行したい場合は「do〜while文」を使用する
  • ループ処理では無限ループに注意し、条件式で使用する値を{}内の処理で値を更新するようにする
  • 変数の値を1つだけ増やしたいときは「加算子」++を使う
  • 変数の値を1つ減らしたいときは「減算子」--を使う
  • 2つ以上の文字列を繋げて1つの文字列として処理したいときは「結合演算子」.を使う
  • 変数へ値を足していくときには「代入演算子」+=を使うことができる

記事一覧

  1. 第1章 PHPが動く仕組み
  2. 第2章 変数と定数
  3. 第3章 配列
  4. 第4章 スーパーグローバル
  5. 第5章 クッキーとセッション
  6. 第6章 サーバー情報の取得
  7. 第7章 if文
  8. 第8章 switch文
  9. 第9章 while文
  10. 第10章 for文
  11. 第11章 foreach文
  12. 第12章 独自の関数
  13. 第13章 オブジェクト指向
  14. 第14章 クラス
  15. 第15章 オブジェクト

記事一覧