多次元配列と行列
多次元配列は配列の中にさらに配列で定義します。数学でいうと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番目の name と price を表示してみましょう。
id | name | price | is_sale |
---|---|---|---|
4 | オレンジジュース | 180 | false |