💡 今日の3行まとめ
  • 配列を指定件数ごとのグループに分けるときは array_chunk($配列, $件数) を使う
  • ループ内で余り計算(%)を書く必要がなくなり、最後の端数データも自動で収まる
  • 連想配列のキーを維持したまま分割したい場合は第3引数に true を指定する

1. 今日のお題とゴール

7名の参加メンバーが入った配列を、先頭から「最大3名ずつ」の班(グループ)に振り分けて一覧出力する処理を作ります。

  • array_chunk() を使って7名の配列を3名ずつの小グループに分割する
  • 最後の端数(1名)も取りこぼさず第3班として出力する
  • 各班の番号・人数・メンバー名(・区切り)を整形して表示する
// 期待する出力例
班1(3名): 佐藤・鈴木・高橋
班2(3名): 田中・伊藤・渡辺
班3(1名): 山本

2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード

❌ やりがちなNGコードBefore
<?php
$members = ['佐藤', '鈴木', '高橋', '田中', '伊藤', '渡辺', '山本'];
$temp = [];

foreach ($members as $i => $name) {
    $temp[] = $name;
    // ❌ 3人たまった時だけ出力するため、最後の端数(山本)が出力されない!
    if (($i + 1) % 3 === 0) {
        echo implode('・', $temp) . "\n";
        $temp = [];
    }
}

ループの中で ($i + 1) % 3 === 0 のように余りを計算して区切る書き方は、要素数が3で割り切れないときに最後の端数(7人目の山本さん)が出力されず消えてしまう定番バグの原因になります。

⭕ コピペで動く正解コード(PHP 8.3+)After
<?php
declare(strict_types=1);

$members = [
    '佐藤', '鈴木', '高橋',
    '田中', '伊藤', '渡辺',
    '山本',
];

$groupSize = 3; // 1グループあたりの最大人数

// 1. 配列を3人ずつのグループ(二次元配列)に分割する
$groups = array_chunk($members, $groupSize);

// 2. 分割されたグループごとに番号と人数を添えて出力する
foreach ($groups as $index => $group) {
    $groupNum = $index + 1;
    $count = count($group);
    $names = implode('・', $group);

    echo "班{$groupNum}({$count}名): {$names}\n";
}

3. ここだけ押さえる!3つのポイント

1array_chunk() で配列を「小配列のリスト」に変換

array_chunk($配列, 3) を呼ぶだけで、元の配列を先頭から3個ずつに切り分けた二次元配列が返ります。最後のグループが3個に満たない端数(1個や2個)でも、取りこぼさず自動で最後の配列に格納されます。

2ループ内のカウンタ変数や余り計算(%)が不要になる

自前で % 3 === 0 のような条件分岐を書くと、ループ終了後に残った端数の処理漏れバグが起きやすくなります。先にデータを分割してから foreach で回すことで、表示コードがシンプルになりミスを防げます。

3連想配列のキーを残したいときは第3引数に true を渡す

通常は分割後の各グループ内で添字が 0, 1, 2... と振り直されます。元の配列のキー(会員IDや商品コードなど)を維持したまま分割したい場合は、array_chunk($配列, 3, true) のように第3引数へ true を指定しましょう。

4. 1分ミニチャレンジ

🚀 手を動かしてみよう

正解コード10行目の $groupSize = 3; を $groupSize = 2; に変えて実行してみましょう。7名のメンバーが「2名・2名・2名・1名」の4つの班へ、端数処理のコードを追加することなく自動で振り分けられることが確認できます。