1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

10: 多次元配列,

Posted at

多次元配列

配列/連想配列の要素として格納できるのは、数値や文字列ばかりでは無い。

任意の型の値、例えば配列そのものを格納してもかまわない。

入れ子の配列

具体例

$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:通常配列と連想配列との混在

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?