二重ループによる反復処理
CoddyのPHPジャーニー「論理とフロー」セクションの一部。レッスン 30/68。
2D array を扱うときは、すべての要素を1つずつ処理する必要があることがよくあります。そのためには各 row を訪れ、その row 内の各列を訪れる必要があります。ここで nested loops が不可欠になります。1つの loop を別の loop の中に配置して、grid 構造全体を体系的にたどります。
外側のループは2D arrayの各rowを反復処理し、内側のループは現在のrow内の各要素を処理します。これはforeachループで次のように動作します。
<?php
$schedule = [
["Meeting", "Lunch", "Presentation"],
["Training", "Review", "Planning"],
["Workshop", "Break", "Demo"]
];
foreach ($schedule as $day) {
foreach ($day as $appointment) {
echo $appointment . "\n";
}
}
?>インデックスをより細かく制御する必要がある場合は、従来の for ループも使用できます。この方法では、行と列の両方の位置にアクセスできます。
<?php
for ($row = 0; $row < count($schedule); $row++) {
for ($col = 0; $col < count($schedule[$row]); $col++) {
echo "Day " . ($row + 1) . ", Time " . ($col + 1) . ": " . $schedule[$row][$col] . "\n";
}
}
?>この入れ子になったループパターンは、データの表示、計算の実行、またはグリッド構造全体からの特定の値の検索など、2D配列を完全に処理するうえで基本となります。
チャレンジ
簡単入力として、教室の座席配置を表すJSON形式の2D arrayを1つ受け取ります。各内側のarrayは座席の1つの行を表し、各要素には生徒の名前または空席を表す空のstringが含まれます。入力をReadし、JSON stringを2D arrayにConvertし、nested loopsを使用してseating配置全体をiterateし、各生徒の名前とその位置を次の形式で出力します: Row X, Seat Y: Name
空席(empty strings)はskipし、occupied seatsの情報のみを出力します。rowsとseatsには、0ではなく1からstartingするnumberを付けます。
入力形式: seating配置を表すJSON arrayを含む1行(例: [["Alice","Bob",""],["","Charlie","Diana"],["Eve","","Frank"]])
期待される出力: 各occupied seatを、Row X, Seat Y: Nameの形式で個別の行に出力します。Xはrow number、Yはseat numberを表し、どちらも1からstartingします。
自分で試してみよう
<?php
// JSON入力を読み取る
$input = trim(fgets(STDIN));
// JSON文字列を2D配列に変換する
$seating = (array)json_decode($input, true);
// TODO: 以下にコードを書いてください
// ネストしたループを使って行と座席を反復処理する
// 空の座席をスキップし、行/座席に1から番号を付けることを忘れないでください
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ