【PHP】for文 - 反復処理 / 同じ処理を繰り返す処理

【PHP】for文 - 反復処理 / 同じ処理を繰り返す処理

同じ処理を繰り返すことを“反復処理”と呼びます。

PHPで反復処理を実現するにはfor文を使います。

ここでは、そのfor文について解説します。

検証環境

反復処理

反復処理は“同じ処理を繰り返す処理”のことです。

for文

for文は反復処理を実現する構文です。

for文を使うことで反復処理の実現だけではなく、ソースコードに拡張性や柔軟性を持たせることが可能です。

基本構文

for( 初期化式; 条件式; 変化式 ) {
    処理
}

初期化式条件式変化式処理の項目を目的のプログラムに合わせて記述します。

各項目の内容は次の通りです。

項目 内容
初期化式 条件式に使用する変数の初期化
条件式 繰り返しの条件
変化式 条件式に使用する変数の値の変更
処理 繰り返す処理

処理の流れ

for文の処理の流れを以下に示します。

流れに沿ったサンプルコードを記載しますので合わせて確認しましょう。

1. 初期化式

for文は初めに初期化式を実行します。

初期化式は条件式で使用する変数を初期化する式です。

<?php

for( $i = 0; 条件式; 変化式 ) {
    処理
}

?>

ここでは変数$i = 0としました。

2. 条件式

次に条件式を実行します。

条件式は比較演算子や論理演算子を使った式で、結果としてtrueまたはfalseが演算されます。

<?php

for( $i = 0; $i < 5; 変化式 ) {
    処理
}

?>

ここでは変数$i < 5とします。

3. 継続・終了の判定

for文の処理について継続または終了を判定します。

判定基準は条件式の演算結果です。

演算結果がtrueの場合は継続し、falseの場合は終了します。

4. 処理

『3. 継続・終了の判定』で継続となった場合にブロック(波括弧{})内の処理を実行します。

<?php

for( $i = 0; $i < 5; 変化式 ) {
    echo ( $i + 1 ) . "回目\n";
}

?>

ここでは変数echo ( $i + 1 ) . "回目\n";とします。

5. 変化式

変化式を実行します。

変化式は条件式に使用する変数の値を変更するための式です。

<?php

for( $i = 0; $i < 5; $i++ ) {
    echo ( $i + 1 ) . "回目\n";
}

?>

ここでは変数$i++とします。

6. 繰り返し

『2. 条件式』の処理に戻ります。


以上がfor文の処理の流れです。

for文の処理順序

ここまでのソースコードを実行すると次の結果になります。

$ php sample1.php
1回目
2回目
3回目
4回目
5回目

処理の具体例

ソースコードを読み具体的な処理をイメージすることは、for文の理解に効果的です。

上記のsample.phpは次の処理を行っています。

反復回数 項目 コード $iの値
- 初期化式 $i = 0 0
1回目 条件式 $i < 5 0
継続・終了の判定 (継続) 0
処理 echo $i."回目の繰り返し処理\n"; 0
変化式 $i++ 1
2回目 条件式 $i < 5 1
継続・終了の判定 (継続) 1
処理 echo ( $i + 1 ) . "回目\n" 1
変化式 $i++ 2
3回目 条件式 $i < 5 2
継続・終了の判定 (継続) 2
処理 echo ( $i + 1 ) . "回目\n" 2
変化式 $i++ 3
4回目 条件式 $i < 5 3
継続・終了の判定 (継続) 3
処理 echo ( $i + 1 ) . "回目\n" 3
変化式 $i++ 4
5回目 条件式 $i < 5 4
継続・終了の判定 (継続) 4
処理 echo ( $i + 1 ) . "回目\n" 4
変化式 $i++ 5
6回目 条件式 $i < 5 5
継続・終了の判定 (終了) 5

6回目で条件式がfalseになり、for文を終了しています。

ポイントは条件式の$iの変化です。

$iがどのように変化し、条件式がどのタイミングでfalseになるかを意識できると理解しやすくなります。

また、$iの値の変化とecho ( $i + 1 ) . "回目\n"を照らし合わせると、実行結果の出力が合っていることが分かります。

サンプル

<?php

$total = 0;

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

echo $total;

?>
$ php sample2.php
55

5〜7行目のfor文によって110までの合計値を計算しています。

for文の繰り返しごとに$total$iの値を加算し、$iの値が1増えます。

条件式は$i <= 10であり、$i110の整数値で繰り返されるため、このような反復処理を実現できます。

メリット

if文のメリットの1つはソースコードに拡張性・柔軟性を生み出すことです。

例えば、sample2.phpをfor文を使わずに書き換えると、次のようなソースコードになります。

<?php

$total = 0;

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

echo $total;

?>

とても冗長的なコードになりました。

11000までの合計値を計算するプログラムとなった場合、$total += 数値のコードを1000行記述することになります。

しかし、for文の場合は条件式の変更だけで対応できます。

<?php

$total = 0;

___ih_hl_start
for( $i = 1; $i <= 1000; $i++ ) {
    $total += $i;
}
___ih_hl_end

echo $total;

?>
$ php sample4.php
500500

for文の方が少ないコード量で同じ処理を実現でき、反復回数の変更が容易であることが分かります。

このようにfor文は“変数の値のみが変わり、処理の本質は変わらない反復処理”に適しています。

ネスト

プログラミング用語のネストは階層的な処理のことです。

例えばfor文の中でfor文を使うような処理で、for文のネストは次のようなソースコードです。

<?php

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

?>
$ php sample5.php
--------------------
$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文を1回繰り返す度に、内側のfor文は5回繰り返されます。

内側のfor文は外側のfor文が繰り返される度に、初期化式を実行するため$j0になります。

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

一見複雑なプログラムに見えますが、コードを上から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