多次元配列と行列

多次元配列は配列の中にさらに配列で定義します。数学でいうとi 行、j 列の行列という考え方です。

(0, 0),(0, 1),(0, 2), ...,(0, j)
(1, 0),(1, 1),(1, 2), ...,(1, j)
...
(i, 0),(i, 1),(i, 2), ...,(i, j)

行列はゲーム・DB・機械学習などの計算で利用

(i, j) のセルの中に数字で入れて行列を作成してみます。この行列を使った計算は、ゲーム開発(2D、3D)や機械学習などで頻繁に利用されるので、データ構造には慣れておくとよいでしょう。

14 , 81, 51, ..., 18
20 , 22, 33, ..., 25
...
60 , 99, 73, ..., 41

Excel で考える

難しく見える多次元配列も2次元であれば、横が行、縦が列のようにExcel の表として視覚化してみるとよいでしょう。

さらに深い構造の多次元は一度に視覚化することは難しいですが、Excel のセルの中にさらに行列をいれて繰り返すことになります。

行列をプログラムで考える

まず空の多次元配列を作ってみましょう。 空のデータとして [ ] にデータ行 [ ] を3行入れます。

[
  [],
  [],
  [],
];

Excel からプログラムの配列をイメージ

1行目1,2,3,4,5、2行目6,7,8,9,10のデータをExcel で作成しました。

これを多次元配列で定義してみます。配列のインデックスは 0 からはじまるので 1行目は 0 になります。

[
  [1, 2, 3, 4, 5,],   //1行 : index = 0
  [6, 7, 8, 9, 10,],  //2行 : index = 1
];

多次元配列の定義と確認

多次元配列を定義し、body 内で var_dump() で確認してみましょう。

<?php
$rows = [
  [90, 78, 82,],
  [62, 70, 68,],
  [68, 88, 72,],
];
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>$rows</h2>
    <?php var_dump($rows); ?>
</body>
</html>

結果

3行のデータ(配列)が表示されました。

array(3) {
  [0]=>
  array(3) {
    [0]=>
    int(90)
    [1]=>
    int(78)
    [2]=>
    int(82)
  }
  [1]=>
  array(3) {
    [0]=>
    int(62)
    [1]=>
    int(70)
    [2]=>
    int(68)
  }
  [2]=>
  array(3) {
    [0]=>
    int(68)
    [1]=>
    int(88)
    [2]=>
    int(72)
  }
}

多次元配列のデータ取得

多次元配列の行データを取得する

多次元配列の最初のインデックスは行です。1行目の配列を取得するには index = 0 でアクセスします。

$cols = $rows[0];
var_dump($cols);
結果

1行目の配列を取得できました。

array(3) {
  [0]=>
  int(90)
  [1]=>
  int(78)
  [2]=>
  int(82)
}

行から列データを取得する

取得した行データから、列データを取得します。

echo $cols[1];
結果
78

行と列のインデックスでデータを取得する

行と列のインデックスを一度に指定して取得できます。

配列[行のインデックス][列のインデックス]

rows の 2行3列のデータを取得してみます。

echo $rows[1][2];
結果
68

連想配列の多次元配列

連想配列と多次元配列を組み合わせると、データベースで利用するような構造で定義できます。

配列に空の配列を入れる

配列に空の配列を3行(3人分のデータ)定義します。

$users = [
  [],
  [],
  [],
]

Excel と多次元連想配列

連想配列で設定したユーザ情報を、配列で定義します。Excel でイメージするとよいでしょう。

これをプログラムで定義すると以下のようになります。

$users = [
    [ 'id' => 1, 'name' => 'User1', 'email' => 'user1@example.com', 'tel' => '03-1111-2222' ],
    [ 'id' => 2, 'name' => 'User2', 'email' => 'user2@example.com', 'tel' => '090-3333-5555' ],
    [ 'id' => 3, 'name' => 'User3', 'email' => 'user3@example.com', 'tel' => '050-1234-5678' ],
];

多次元連想配列の定義と表示

以下の $users から配列のインデックスを指定して一人ずつつの name をHTML表示してみましょう。

$users = [
    [ 'id' => 1, 'name' => 'Alice'],
    [ 'id' => 2, 'name' => 'Bob'],
    [ 'id' => 3, 'name' => 'Chris'],
];

$users からインデックス = 0, 1, 2 のユーザを取り出し、キーがnameの値を表示します。

<ul>
    <li><?= $users[0]['name'] ?></li>
    <li><?= $users[1]['name'] ?></li>
    <li><?= $users[2]['name'] ?></li>
</ul>
結果

ユーザの名前をリスト表示できました。

  • Alice
  • Bob
  • Chris

問題1

多次元配列 $drinks から「アイスコーヒー」を、配列のインデックスを指定してすべてHTML表示してみましょう。

$drinks = [
    ['アイスコーヒー', 'ミネラルウォーター', 'ほうじ茶',],
    ['紅茶', '牛乳', 'アイスコーヒー',],
    ['ウーロン茶', 'コーラ', 'オレンジジュース',],
    ['ミネラルウォーター', 'コーラ', 'ほうじ茶',],
];

問題2

多次元配列 $scores の「68」のデータを配列のインデックスを指定して $new_score の値で更新してみましょう。

$scores = [
    [90, 78, 82,],
    [62, 70, 68,],
    [71, 88, 72,],
];
$new_score = 80;

問題3

以下の商品の表を、多次元連想配列 $items で作成してみましょう。

id name price is_sale
1 コーヒー 120 true
2 紅茶 150 false
3 ほうじ茶 100 true

問題4

問題3の $items からほうじ茶の価格をHTMLで表示してみましょう。

問題5

問題3 の $items に以下のデータを追加し price を降順(大きい)に並び換えます。その結果、1番目の nameprice を表示してみましょう。

id name price is_sale
4 オレンジジュース 180 false

PHP超入門