💡 今日の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つのポイント
1
array_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つの班へ、端数処理のコードを追加することなく自動で振り分けられることが確認できます。