ch05 8章中 5章目

ch05 — for で配列を走査する

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch05 — for で配列を走査する」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch05 — for で配列を走査する」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch05 — for で配列を走査する」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

組み込み関数だけで完結する処理はラクだが、現実には 「合計と同時に平均も出したい」「ある条件の要素だけ加算したい」 のように、関数 1 つでは足りない複合処理がよく出てくる。そんな時に必要なのが for ループで配列を走査する 技術。配列の添字を 0 から count($arr) - 1 まで動かして、1 要素ずつ取り出して処理を組み立てる。

定型は for ($i = 0; $i < count($arr); $i++) { ... $arr[$i] ... } の形。ループの中で $arr[$i] を使えば、現在の要素にアクセスできる。「ループ条件で毎回 count($arr) を呼ぶと遅いのでは」と心配する人もいるが、PHP の count は内部にカウンタを持っていて、配列のサイズを O(1) で返す。よほど巨大でなければ気にしなくていい。

ここでのドリルでは array_summaxあえて使わずに 同じ処理を for で組み直す。これは「組み込み関数の中身ではこういうループが走っている」ことを体感するための練習で、内部動作のイメージを持っていると、後で「自分の要件にぴったり合う組み込み関数が無いとき」に for で書き起こせる。関連トピックの array-assoc では連想配列向けの foreach も登場するので、まずは添字を直接動かす for に慣れておく。

学習目標

  • for ($i = 0; $i < count($arr); $i++) で配列の全要素を 1 つずつ処理できる
  • 走査中に合計や最大値を計算できる
  • array_sum / max使わずに 同じ処理を組める

ドリル

no 内容
01 for で配列の全要素を 1 行ずつ出力
02 for で配列の合計を計算して出力 (array_sum 使わない)
03 for で配列の最大値を探して出力 (max 使わない)

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. for で配列を走査する

    Lesson 4 / Chapter 5

  2. 添字を 0 から count() - 1 まで動かす

    <?php
    $nums = [10, 20, 30];
    
    for ($i = 0; $i < count($nums); $i++) {
        echo $nums[$i] . "\n";
    }

    実行結果:

    10
    20
    30
    • $i = 0 から始める (添字は 0 始まり)
    • $i < count($nums) の間ループ
    • $nums[$i] で現在の要素を取り出す
  3. 条件は <<= を間違えない

    for ($i = 0; $i < count($nums); $i++) {     // 正しい
    for ($i = 0; $i <= count($nums); $i++) {    // ❌ 1 個多くアクセスして範囲外
    • 添字は 0 から count() - 1 まで が有効
    • $i < count($nums) (より小さい) が正解
    • $i <= count($nums) だと最後で範囲外アクセスになる
  4. ループの中で合計を計算

    <?php
    $nums = [10, 20, 30, 40, 50];
    $sum = 0;
    
    for ($i = 0; $i < count($nums); $i++) {
        $sum += $nums[$i];
    }
    
    echo $sum . "\n";   // 150
    • $sum = 0; で初期化
    • ループの中で $sum += $nums[$i]; を繰り返す
    • array_sum() を使わなくても同じ結果になる
  5. ループの中で最大値を探す

    <?php
    $nums = [22, 30, 18, 27, 25];
    $best = $nums[0];   // 最初の要素を仮の最大に
    
    for ($i = 1; $i < count($nums); $i++) {
        if ($nums[$i] > $best) {
            $best = $nums[$i];
        }
    }
    
    echo $best . "\n";   // 30
    • まず最初の要素を「仮の最大」に置く
    • 2 番目以降を見て、大きければ更新する
    • max() を使わない実装の定番
  6. なぜ手で書くのか

    • 関数 1 つで終わる処理でも、ループの 中身を理解 すると応用がきく
    • 例: 「最大値の 添字 を取りたい」「合計ではなく が欲しい」
    • 関数では足りないとき、自分で書ける必要がある
  7. このチャプターでできるようになること

    for ($i = 0; $i < count($arr); $i++) で全要素を走査できる ✅ ループの中で合計を計算できる ✅ ループの中で最大値を探せる ✅ 添字の範囲外 (<= 問題) を避けられる

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

Lesson 4 / Chapter 5


添字を 0 から count() - 1 まで動かす

<?php
$nums = [10, 20, 30];

for ($i = 0; $i < count($nums); $i++) {
    echo $nums[$i] . "\n";
}

実行結果:

10
20
30
  • $i = 0 から始める (添字は 0 始まり)
  • $i < count($nums) の間ループ
  • $nums[$i] で現在の要素を取り出す

条件は <<= を間違えない

for ($i = 0; $i < count($nums); $i++) {     // 正しい
for ($i = 0; $i <= count($nums); $i++) {    // ❌ 1 個多くアクセスして範囲外
  • 添字は 0 から count() - 1 まで が有効
  • $i < count($nums) (より小さい) が正解
  • $i <= count($nums) だと最後で範囲外アクセスになる

ループの中で合計を計算

<?php
$nums = [10, 20, 30, 40, 50];
$sum = 0;

for ($i = 0; $i < count($nums); $i++) {
    $sum += $nums[$i];
}

echo $sum . "\n";   // 150
  • $sum = 0; で初期化
  • ループの中で $sum += $nums[$i]; を繰り返す
  • array_sum() を使わなくても同じ結果になる

ループの中で最大値を探す

<?php
$nums = [22, 30, 18, 27, 25];
$best = $nums[0];   // 最初の要素を仮の最大に

for ($i = 1; $i < count($nums); $i++) {
    if ($nums[$i] > $best) {
        $best = $nums[$i];
    }
}

echo $best . "\n";   // 30
  • まず最初の要素を「仮の最大」に置く
  • 2 番目以降を見て、大きければ更新する
  • max() を使わない実装の定番

なぜ手で書くのか

  • 関数 1 つで終わる処理でも、ループの 中身を理解 すると応用がきく
  • 例: 「最大値の 添字 を取りたい」「合計ではなく が欲しい」
  • 関数では足りないとき、自分で書ける必要がある

このチャプターでできるようになること

for ($i = 0; $i < count($arr); $i++) で全要素を走査できる ✅ ループの中で合計を計算できる ✅ ループの中で最大値を探せる ✅ 添字の範囲外 (<= 問題) を避けられる

→ ドリルへ

この章で取り組む 演習問題の流れ (3ステップ)
  1. 01 ドリル 01 — 全要素を出力 README.md starter.php answer.php
  2. 02 ドリル 02 — for で合計 README.md starter.php answer.php
  3. 03 ドリル 03 — for で最大値 README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — 全要素を出力

問題

配列 [10, 20, 30, 40, 50] の全要素を for ループで 1 行ずつ 出力してください。

期待される出力:

10
20
30
40
50

ヒント

  • $nums = [10, 20, 30, 40, 50];
  • for ($i = 0; $i < count($nums); $i++) { echo $nums[$i] . "\n"; }

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — for で合計

問題

配列 [5, 10, 15, 20, 25] の合計を for ループ で計算して 1 行出力してください。 array_sum() は使わないこと。

期待される出力:

75

ヒント

  • $nums = [5, 10, 15, 20, 25];
  • $sum = 0;
  • for ($i = 0; $i < count($nums); $i++) { $sum += $nums[$i]; }
  • echo $sum . "\n";

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 03 — for で最大値

問題

配列 [14, 27, 9, 41, 33, 20] の最大値を for ループ で探して 1 行出力してください。 max() は使わないこと。

期待される出力:

41

ヒント

  • $nums = [14, 27, 9, 41, 33, 20];
  • $best = $nums[0]; で仮の最大に最初の要素を入れる
  • for ($i = 1; $i < count($nums); $i++) { if ($nums[$i] > $best) $best = $nums[$i]; }
  • echo $best . "\n";

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(3問)

  1. ドリル 01 — 全要素を出力

    README.md starter.php answer.php

  2. ドリル 02 — for で合計

    README.md starter.php answer.php

  3. ドリル 03 — for で最大値

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます