※ この記事は、閲覧者が既に配列や連想配列について理解している前提で書かれています
高次元ってなに?
配列は要素が 0 番から番号順に「直線状に」ずらずらと並んでいますね?数学的に言うと 1 次元は直線上の世界ですので、単純な配列のことを 1 次元の配列と呼ぶこともあります。
対して高次元配列というのは 2 次元以上、配列の中の要素が単純な値ではなく、その要素自体が配列であったりなど複数の値を持っているものを指します。たとえば
| index | 商品 |
|---|---|
| 0 | みかん |
| 1 | りんご |
| 2 | バナナ |
| 3 | ぶどう |
| 4 | すいか |
| 5 | なし |
| 6 | もも |
| 7 | かき |
というように「果物の名前」だけが並んでいる配列が 1 次元配列で
| index | 商品 | 仕入原価 | 販売価格 |
|---|---|---|---|
| 0 | みかん | 30 | 50 |
| 1 | りんご | 40 | 45 |
| 2 | バナナ | 25 | 40 |
| 3 | ぶどう | 80 | 120 |
| 4 | すいか | 200 | 350 |
| 5 | なし | 60 | 75 |
| 6 | もも | 100 | 150 |
| 7 | かき | 50 | 65 |
のように名前のほかに複数の内容を持っている配列が 2 次元の配列です。 Excel などの表計算ソフトのスプレッドシートやデータベースのレコードなどでよく目にしますね。
通常こういった 2 次元の配列は何らかのオブジェクト ―― 配列や連想配列、クラス、構造体など様々ですが ―― の配列として定義されます。
じゃぁ 3 次元以上の配列って?
では「コンストラクタ」の記事で言及した「人」クラスを利用して説明してみましょう。また皆さんには神になってもらいます。
最初にコンストラクタを利用して adam という人クラスを、次に同じようにコンストラクタを利用して eve を作りました。これらの人クラスを humans という配列に add します。人クラス自体が name や sex などの複数のプロパティを持っていますので、配列 humans はこの時点で要素を 2 つ持った 2 次元配列と表現することができます。
ではこれに次元を足していきましょう。
人クラスには isAteApple という真偽値を格納するプロパティがあります(ある。イイネ?)が、コンストラクタで adam と eve を生成した直後から時間が経過してこのプロパティが false から true に変わったとしましょう。
でも生成した直後のデータも残しておきたい。神はそうお思いになったので、新たに humansRecords という配列と humansRecord という連想配列を定義なさいました。humansRecord はプロパティに humans 配列と recordDateTime という日付型データを持ちます。
そして神は humansRecords に
recordDateTime = 0000-00-00 00:00:00 humans = [生成直後の adam と eve が格納された humans 配列]
のデータを持った humansRecord と
recordDateTime = ※宗教的理由により表示できません※ humans = [isAteApple が true になっている adam と eve が格納された humans 配列]
のデータを持った humansRecord を add して、良しとされた。3 次元配列の誕生である。
ここで神は気まぐれをおこされた。この人間どもを平行世界に送ったらどうなるのだろうと。そこで神は worlds という配列と humansRecords をプロパティに持つ world という連想配列を定義なさいました。そして神は
world_0 = New world("world_0", humansRecords) world_1 = New world("world_1", humansRecords)
して複数の世界に adam と eve のレコードが格納された連想配列をコピーし、これを worlds に add なさいました。 4 次元配列の誕生である。
……とまぁ、このように次元はどんどん増やしていくことが可能です。 現実の物理世界と違って次元の軸が直交していなければならない訳ではない のがポイントですね。あまり次元を上げていくと後でコードをメンテする人が迷惑をするので、不必要に複雑な配列を作るのはやめましょう。
「後でコードをメンテする人」には未来の自分が含まれていることをお忘れなく。