ITHACK
~ みんなのIT部門 ~

【PHP】for文(繰り返し処理) – 同じ処理を複数回実行する

同じ処理を複数回行う処理を繰り返し処理と呼びます。
繰り返し処理を実現するfor文という仕組みがあり、プログラムに拡張性・柔軟性を持たせるために必要な知識です。

ここでは繰り返し処理(for文)について解説します。

  • 繰り返し処理

  • for文

  • for文のメリット

  • for文のネスト

繰り返し処理とは

繰り返し処理とは『同じプログラムを複数回実行する処理』のことです。

基本構文

繰り返し処理を実現するにはfor文を使います。
for文の基本構文は次のようになります。

for( (A)初期化式; (B)条件式; (C)変化式 ) {
    (D)処理1
    (D)処理2
    (D)・・・
}

forや丸括弧()、波括弧{}は基本的には同じように記述しますが、(A)〜(D)の部分は作るプログラムにより変わります。

処理の順序

for文の処理の順序は次のようになります。

  1. (A)初期化式を実行
  2. (B)条件式を実行
  3. 繰り返し処理の終了判定(条件式が真の場合4へ、偽の場合for文を終了)
  4. (D)処理を実行(波括弧で囲まれたコード)
  5. (C)変化式を実行
  6. 2に戻る

(A)は1度だけ実行され、その後(B)→(C)→(D)を繰り返し実行します。
ポイントは2の『繰り返し処理の終了判定』です。(B)条件式の演算結果が真である場合、繰り返し処理を実行し続けます。
また、(A)〜(D)の役割は次のようになります。

1. (A)初期化式

(B)条件式で使用する変数を初期化する。

2. (B)条件式

条件式から真偽値を演算する。

3. (C)変化式

条件式で使用する変数の値を変更します。

4. (D)処理

繰り返し実行する処理です。

以上がfor文の処理順序になりますが、イメージしやすいよう画像を載せておきます。

サンプルコード

次のサンプルコードで理解を深めましょう。

<?php

for( $i = 0; $i < 5; $i++ ) {
    echo $i."回目の繰り返し処理\n";
}

?>
0回目の繰り返し処理
1回目の繰り返し処理
2回目の繰り返し処理
3回目の繰り返し処理
4回目の繰り返し処理

このサンプルコードの初期化式、条件式、変化式、処理は次のようになります。

構文 コード
初期化式 $i = 0
条件式 $i < 5
変化式 $i++
処理 echo $i."回目の繰り返し処理\n";

実行結果の『●回目の繰り返し処理』という出力の数から、繰り返し処理が5回実行されていることが分かります。
ポイントは$i < 5がどのタイミングで偽(false)になり、繰り返し処理が終了するかになります。

理解しやすくするため、$iの値を基準に実行されるコードを表にしましたのでご覧ください。

$i コード 繰り返し回数
0 $i = 0 初期化
0 $i < 5 1回目
0 echo $i."回目の繰り返し処理\n"; 1回目
1 $i++ 1回目
1 $i < 5 2回目
1 echo $i."回目の繰り返し処理\n"; 2回目
2 $i++ 2回目
2 $i < 5 3回目
2 echo $i."回目の繰り返し処理\n"; 3回目
3 $i++ 3回目
3 $i < 5 4回目
3 echo $i."回目の繰り返し処理\n"; 4回目
4 $i++ 4回目
4 $i < 5 5回目
4 echo $i."回目の繰り返し処理\n"; 5回目
5 $i++ 5回目
5 $i < 5 6回目(終了)

6回目で条件式がfalseになり、繰り返しを終了しています。
繰り返し処理を使う際は、条件式の値が繰り返しごとにどのように変化していくのかを意識できると扱いやすくなります。

メリット

ここまで理解できていれば、ある程度for文を使いこなせるようになっていると思います。
更に1歩、理解を深めるためfor文のメリットを解説します。

例えば、1〜10までの数値の合計値を算出する場合、for文を使用しない場合は次のようになります。

<?php

$total = 0;
$total = $total + 1;
$total = $total + 2;
$total = $total + 3;
$total = $total + 4;
$total = $total + 5;
$total = $total + 6;
$total = $total + 7;
$total = $total + 8;
$total = $total + 9;
$total = $total + 10;

echo '1〜10の合計値は'.$total."です\n";

?>
1〜10の合計値は55です

これをfor文を使うと次のようになります。

<?php

$total = 0;
for( $i = 1; $i <= 10; $i++ ) {
    $total = $total + $i;
}

echo '1〜10の合計値は'.$total."です\n";

?>
1〜10の合計値は55です

短く簡潔なコードになったことがぱっと見で分かります。

そして、例えば、これが1〜9999までの合計値だった場合、for文を使わない方法だと少なくとも9999行も同じようなコードを記述することになります。

しかし、for文の場合は条件式の$i <= 10の10を9999に書き換えるだけで合計値を計算できます。

<?php

$total = 0;
for( $i = 1; $i <= 9999; $i++ ) {
    $total = $total + $i;
}

echo '1〜10の合計値は'.$total."です\n";

?>
1〜10の合計値は49995000です

このように同様の処理であれば処理の回数が増えても記述量が変わらないのはfor文の大きなメリットです。

ネスト

for文の中でfor文を使うことができ、階層的なっていることをプログラミング用語でネストと呼びます。
例えば、ネストを使ったコードは次のようになります。

<?php

for( $i = 0; $i < 3; $i++ ) {
    echo "--------------------\n";
    for( $j = 0; $j < 5; $j++ ) {
        echo '$i = '.$i.' / $j = '.$j."\n";
    }
}

?>
--------------------
$i = 0 / $j = 0
$i = 0 / $j = 1
$i = 0 / $j = 2
$i = 0 / $j = 3
$i = 0 / $j = 4
--------------------
$i = 1 / $j = 0
$i = 1 / $j = 1
$i = 1 / $j = 2
$i = 1 / $j = 3
$i = 1 / $j = 4
--------------------
$i = 2 / $j = 0
$i = 2 / $j = 1
$i = 2 / $j = 2
$i = 2 / $j = 3
$i = 2 / $j = 4

外側のfor文(3行目の)を1回繰り返す度に、内側のfor文(4行目)は5回繰り返します。
内側のfor文は外側のfor文が繰り返される度に、初期化式を実行するため$j0になります。

外側のfor文は3回繰り返すので、echo '$i = '.$i.' / $j = '.$j."\n"は計15回(=3×5)実行します。

一見複雑なプログラムに見えますが、プログラムはコードを上から1つずつ実行するので、1つずつ読み進めると分かりやすくなります。

演習問題

問題1

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

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

問題2

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

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

問題3

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

  • for文を使う。
-- 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

まとめ

for文は繰り返し処理を行う仕組みです。

プログラミングでは必須といっても過言ではない知識です。
初めは理解が難しかったり、上手く使えないことがありますが、for文を使えるかどうかを意識しながらプログラミングしていくと自然と使い所が身についていきますので覚えていきましょう。