配列/連想配列の要素として格納できるのは、数値や文字列ばかりでは無い。
任意の型の値、例えば配列そのものを格納してもかまわない。
入れ子の配列
具体例
$data1 = [
[‘x-1’, ‘x-2’, ‘x-3’],
[‘y-1’, ‘y-2’, ‘y-3’],
[‘z-1’, ‘x-2’, ‘x-3’],
];
配列$data1
0 | 1 | 2 | |
---|---|---|---|
0 | [0,0]x-1 | [0,1]x-2 | [0,2]x-3 |
1 | [1,0]y-1 | [1,1]y-2 | [1,2]y-3 |
2 | [2,0]z-1 | [2,1]z-2 | [2,2]z-3 |
上記は二次元配列 |
このように「配列の配列」を表すようなケースでは、最低限、要素ごとに改行とインデントを加えると構造が分かりやすくなり、コードも読みやすくなる。
構文規則ではないが、少し心掛ける。
配列の配列から値を取り出すには、これまでと同様、ブラケット構文でそれぞれの次元のインデックス番号を指定する。
$data[1][0]
//結果: y-1
インデックス番号が一つだけの配列を一次元配列、インデックス番号が二個の配列(配列の配列)を二次元配列、またはより一般的に多次元配列とも言う。
理論的には、同じ要領で[...]を入れ子にすることで、4次元、5次元配列を作成することもできるが、直感的に理解しやすいと言う意味でも、普通に利用するのはせいぜい3次元配列まで。
$data2 = [
[
[‘s牛肉’, ‘m牛肉’, ‘l牛肉’],
[‘s豚肉’, ‘m豚肉’, ‘l豚肉’],
[‘s鶏肉’, ‘m鶏肉’, ‘l鶏肉’],
],
[
[‘sコーラ’, ‘mコーラ’, ‘lコーラ’],
[‘sサイダー’, ‘mサイダー’, ‘lサイダー’],
[‘sファンタ’, ‘mファンタ’, ‘lファンタ’],
],
[
[‘sポテト’, ‘mポテト’, ‘lポテト’],
[‘sカレー’, ‘mカレー’, ‘lカレー’],
[‘sキムチ鍋’, ‘mキムチ鍋’, ‘lキムチ鍋’],
],
];
echo $data[2][2][0];
//結果: sキムチ鍋
上記はインデックス番号が3つなので多次元配列。
また、配列の中に連想配列を含めることもできる。
例
<?php
$data3 = [
[
‘name’ => ‘山田孝之’,
‘age’ => 35,
‘sex’ => ‘男’,
],
[
‘name’ => ‘タモリ’,
‘age’ => 15,
‘sex’ => ‘男’,
],
[
‘name’ => ‘釈由美子’,
‘age’ => 25,
‘sex’ => ‘女’,
],
];
[0] | |
---|---|
[name] | 山田孝之 |
[age] | 35 |
[sex] | 男 |
[1] | |
---|---|
[name] | タモリ |
[age] | 15 |
[sex] | 男 |
[2] | |
---|---|
[name] | 釈由美子 |
[age] | 25 |
[sex] | 女 |
上記は配列と連想配列の入れ子
このような形式の配列は、データベースからデータを取り出す場合などにもよく使われるので、きちんと理解する。
ここまでの説明では、便宜上、数字キーを持つ通常配列と、文字列キーを持つ連想配列とを別物として解説して方が、厳密には、PHPはこれらを区別しない。
唯一の配列型があるだけで、そのキーが数値であるか文字列であるかによって、両者を区別しているに過ぎない。
その理解を踏まえて以下の例をもって配列の理解を深める。
通常配列と連想配列とが本質的に同じものであることが分かれば、通常配列でもキー名(インデックス番号)を指定できるのは何ら不思議なことではない。
<?php
$data = [1 => ‘山田’, 2 => ‘松本’, 3 => ‘浜田’, 4 => ‘濱田’]
print_r($data);
//結果:
Array
(
[1] => 山田
[2] => 松本
[3] => 浜田
[4] => 濱田
)
通常配列のようにインデックス番号が省略された場合には、ゼロから始まる番号が自動的に振られていた。
一部の値だけにインデックス番号を振ることもできる。
この場合、「その時点での最大インデックス番号+1」が自動的に割り振られる。
例えば下記のようなケースではすでに4まで番号が振られているので、次の「カツオ」のインデックス番号は5となる。
<?php
$data = [1 => ‘マグロ’, 4 => ‘シャケ’, ‘カツオ’];
print_r($data);
//結果:
Array
(
[1] => マグロ
[4] => シャケ
[5] => カツオ
ただし最大のインデックス番号が負数である場合は例外。
この場合、次のインデックス番号を決めるルールは、バージョンによって変化する。
例
<?php
$data = [-10 => ‘河野’, ‘伊藤’];
print_r($data);
//結果:
//PHP7.4以前
Array
(
[-10] => 河野
[0] => 伊藤
//PHP8以降
Array
(
[-10] => 河野
[-9] => 伊藤
PHP7.4以前では、強制的にゼロが割り当てられるのに対して、PHP8以降では整数インデックスの場合と同じく、「最大インデックス+1」が振られる。
負数インデックスを積極的に利用する機会はさほどないが、互換性のない変更なので、頭の片隅に留めておく。
11:通常配列と連想配列との混在