for文

目次
  • 解説
  • 1. for文
問題に挑戦!
進捗を変更する




解説

1. for文


ループはその性質から、配列とセットで使用されることが非常に多いのですが、前のページで学習した通り、while文の場合は次のような書き方が必要となります。

  • while文の前で、添字用の変数の作成と代入を行う
  • ブロックの中で、添字用の変数を変化させる
  • 条件式で、添字用の変数と要素数を比較する

この場合、添字管理用のコードが分散してしまうことや、書き忘れによる無限ループに繋がりやすいことなど、少し不便です。

    static function practiceWhile() {
        $sellCounter = [10, 20, 30];

        $counterIndex = 0;                             // 添字に使う変数
        while ($counterIndex < count($sellCounter)) {                   // 添字が2以下の間
            Logger::echo($sellCounter[$counterIndex]); // 添字に応じた出力処理
            $counterIndex++;                           // 添字を+1
        }
    }

そこでfor文の登場です。for文はこれらの添字管理用のコードが1行に凝縮されています。

    static function practiceFor() {
        $sellCounter = [10, 20, 30];

        for ($idx = 0; $idx < count($sellCounter); $idx++) {
            Logger::echo($sellCounter[$idx]);
        }
    }

キーワード「for」に続く丸括弧の中はセミコロン「;」で3つに区切られています。仮に

for ( A; B; C ) { ~ }

とした場合、

  • Aで、添字用の変数の作成と代入を行う
  • Bで、添字用の変数と要素数を比較する(=条件式)
  • Cで、添字用の変数を変化させる

のようになっています。言い換えると、

  • Aは、for文のいちばん最初に1回のみ実行される
  • Bは、ブロックを実行する前に毎回評価される
  • Cで、ブロックを実行した後に毎回実行される

という構造となっており、配列の添字などのように、連続して変化する値を使用するループ処理を行うことに最適です。このような場合にはwhile文よりfor文を使用するようにしましょう。

なお、for文では添字用の変数スコープが、ブロック内に限定されるということも大きなメリットです。添字用の変数の変数名は、添字としての用途が明確となることや、for文の行が長くなり過ぎることを防ぐ目的から、「idx」や「i」のような短縮形を用いることが一般的です。

問題

確認問題


確認問題

次のコードの中で、for文の使い方が正しく、
変数aの値が最終的に8となる構文はどれか。

実践問題


(1)VSCodeを起動し、ヘッダーメニューの「ファイル」>「フォルダーを開く...」から、「php_basic」プロジェクトを開いてください。
(2)php_basic」プロジェクトの「ArrayAndLoop.php」を開いてください。
※無い場合は「配列」を先に学習しましょう。
(3)ArrayAndLoop」クラス内に次のサンプルコードのメソッドをコピー&ペーストし、
mainから呼び出せるようにして、「http://localhost/php_basic/ArrayAndLoop.php」へのアクセスで表示されることを確認してください。
(4)コメント行に記された各問題文に対し、答えとなるプログラムコードを
問題文の次の空白行以降に書き込みまたは書き換えて
、ブラウザから確認してください。
    static function questionFor() {
        // (問1)空白行にString型の配列変数arrayQ1を作成し、
        // 「あ」「い」「う」「え」「お」の5つの要素を代入してください。
        // 続けてfor文によるループ処理を作成し、
        // 変数displayQ1にすべて結合させてください。
        $displayQ1 = '';

        Logger::echo($displayQ1);

        // (問2)空白行にfor文によるループ処理を作成し、
        // arrayQ1から「あ」「う」「お」のみを
        // 変数displayQ2に結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        $displayQ2 = '';

        Logger::echo($displayQ2);

        // (問3)空白行にfor文によるループ処理を作成し、
        // 変数displayQ3にarrayQ1の中身を逆順ですべて結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        $displayQ3 = '';

        Logger::echo($displayQ3);

        // (問4)空白行にfor文によるループ処理を作成し、
        // 変数displayQ4にarrayQ1の中身の内、
        // 「え」のみを除いて逆順で結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        $displayQ4 = '';

        Logger::echo($displayQ4);
    }
実行結果例を表示
[2020/12/31 12:34:56] あいうえお
[2020/12/31 12:34:56] あうお
[2020/12/31 12:34:56] おえういあ
[2020/12/31 12:34:56] おういあ

正解


(問1)正解を表示
$arrayQ1 = ['あ', 'い', 'う', 'え', 'お'];
for ($idx = 0; $idx < count($arrayQ1); $idx++) {
    $displayQ1 .= $arrayQ1[$idx];
}

(問2)正解を表示
for ($idx = 0; $idx < count($arrayQ1); $idx += 2) {
    $displayQ2 .= $arrayQ1[$idx];
}

(問3)正解を表示
for ($idx = count($arrayQ1) - 1; $idx >= 0; $idx--) {
    $displayQ3 .= $arrayQ1[$idx];
}

(問4)正解を表示
for ($idx = count($arrayQ1) - 1; $idx >= 0; $idx--) {
    if (!($arrayQ1[$idx] === 'え')) {
        $displayQ4 .= $arrayQ1[$idx];
    }
}

正解プログラムコード全文を表示
    static function questionFor() {
        // (問1)空白行にString型の配列変数arrayQ1を作成し、
        // 「あ」「い」「う」「え」「お」の5つの要素を代入してください。
        // 続けてfor文によるループ処理を作成し、
        // 変数displayQ1にすべて結合させてください。
        $displayQ1 = '';
        $arrayQ1 = ['あ', 'い', 'う', 'え', 'お'];
        for ($idx = 0; $idx < count($arrayQ1); $idx++) {
            $displayQ1 .= $arrayQ1[$idx];
        }

        Logger::echo($displayQ1);

        // (問2)空白行にfor文によるループ処理を作成し、
        // arrayQ1から「あ」「う」「お」のみを
        // 変数displayQ2に結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        $displayQ2 = '';
        for ($idx = 0; $idx < count($arrayQ1); $idx += 2) {
            $displayQ2 .= $arrayQ1[$idx];
        }

        Logger::echo($displayQ2);

        // (問3)空白行にfor文によるループ処理を作成し、
        // 変数displayQ3にarrayQ1の中身を逆順ですべて結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        $displayQ3 = '';
        for ($idx = count($arrayQ1) - 1; $idx >= 0; $idx--) {
            $displayQ3 .= $arrayQ1[$idx];
        }

        Logger::echo($displayQ3);

        // (問4)空白行にfor文によるループ処理を作成し、
        // 変数displayQ4にarrayQ1の中身の内、
        // 「え」のみを除いて逆順で結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        $displayQ4 = '';
        for ($idx = count($arrayQ1) - 1; $idx >= 0; $idx--) {
            if (!($arrayQ1[$idx] === 'え')) {
                $displayQ4 .= $arrayQ1[$idx];
            }
        }

        Logger::echo($displayQ4);
    }