🙄

スコアボードを例に多次元構造を理解しよう [PHP入門]

に公開

配列を「階層構造」で考える

1 次元配列を使っていると、データのまとまりが複雑になる瞬間があります。

たとえば、バスケの 3on3 チームを 2 組管理する場合、単純に 1 つの配列に全員の名前を入れると、どこからが自チームでどこからが敵チームなのか分からなくなります。

$members = [
  '佐藤さん', '田中さん', '加藤さん', // 自チーム
  '金子さん', '山下さん', '藤原さん', // 敵チーム
];

これでは人数が変動したときに破綻します。
解決策は「配列の中に配列を入れる」こと。これが2次元配列です。

$members_by_team = [
  ['佐藤さん', '田中さん', '加藤さん'], // 自チーム
  ['金子さん', '山下さん', '藤原さん'], // 敵チーム
];

print_r() で出力すると、Array の中にさらに Array があり、データが階層的に整理されているのがわかります。
PHP の配列は柔軟で、こうした 「配列の中に配列」 という多次元構造を簡単に表現できます。

2 次元配列の基本アクセス

1 次元配列では $array[0] のように [ ] が 1 つでしたが、2 次元配列では [ ] が 2 つになります。
左の添字が「外側の配列(1次元)」、右が「内側の配列(2次元)」です。

echo $members_by_team[0][1]; // 田中さん
echo $members_by_team[1][0]; // 金子さん

echo $members_by_team[0] のように1つだけ指定すると、「配列をそのまま返す」ため、echo ではエラーになります。
この場合は var_dump() を使って中身を確認しましょう。

コアボードで考える2次元配列

実用例として「野球のスコアボード」を作ります。
2 チーム × 5 回の得点を管理するなら、2×5 の配列が最適です。

$score_board = [
  [0, 0, 2, 0, 1],
  [0, 1, 0, 1, 0],
];

print_r() で確認すると、チームごとに 5 回分の得点がまとめられているのが分かります。
この構造を使えば、スコアの集計や出力もシンプルにできます。

for 文で 2 次元配列を処理する

1 次元配列では次のように for 文で全要素を出力します。

$members = ['佐藤さん', '田中さん', '加藤さん'];
for ($i = 0; $i < count($members); $i++) {
  echo $members[$i] . PHP_EOL;
}

では、2 次元配列なら?

単純に $members_by_team[$i]echo すると「配列を文字列として出力できない」というエラーになります。
これは、1 次元目の要素が配列だからです。

$members_by_team[$i][$j] のように、内側の要素も指定する必要があります。
ここで使うのが for文のネスト(入れ子) です。

for ($i = 0; $i < count($members_by_team); $i++) {
  for ($j = 0; $j < count($members_by_team[$i]); $j++) {
    echo $members_by_team[$i][$j] . PHP_EOL;
  }
}

外側のループがチーム(1 次元)、内側のループがメンバー(2 次元)を担当します。
こうすることで、すべての要素を順に取り出すことができます。

まとめ

  • 1 次元配列では複雑なデータを扱うのは限界がある
  • 配列の中に配列を入れて「2次元配列」にすれば、構造的に整理できる
  • 添字は [外側][内側] の順番で指定
  • 出力には for の入れ子(ネスト)を活用する

このように、2 次元配列を理解すると「チームとメンバー」「クラスと生徒」「行と列」など、現実世界の構造をコードで自然に表現できるようになります。


本記事は弊社の次プログラミング教材の要約です。

PHP ファーストステップ講座 009 2次元配列
https://www.amazon.co.jp/dp/B0FDVGWXYX

ほかにも FOR文・配列・条件分岐などを小ステップで練習できる教材も用意しています。
興味があればそちらも覗いてみてください。

イーエスファイン IT人材育成部の書籍
https://www.amazon.co.jp/stores/author/B0F2ML4WTH

Discussion