【PHP】多次元配列 - 配列を階層的に記憶するデータ構造

【PHP】多次元配列 - 配列を階層的に記憶するデータ構造

配列の値として配列を記憶することができます。

そのような配列が階層的になっているデータ構造を多次元配列と呼びます。

ここでは多次元配列について解説します。

検証環境

多次元配列

多次元配列は配列が階層的になっているデータ構造の配列です。

配列の値が配列であるようなデータ構造で、その階層数に応じて2次元配列や3次元配列と呼びます。

また、PHPに多次元配列のための特別な仕組みはありません。

通常の配列や連想配列を使って多次元配列を実現します。

多次元配列の生成

多次元配列の生成は通常の配列と同じです。

基本構文

変数 = []

サンプル

<?php

___ih_hl_start
$fruits = [];
___ih_hl_end

var_dump($fruits);
 
?>
$ php sample.php
array(0) {
}

このサンプルの段階では$fruitsは値に配列を持たないため、1次元配列です。

多次元配列の初期化

配列の初期化で値に配列を記述することで多次元配列を実現できます。

基本構文

変数 = [
    [ 値1, 値2, 値3 ],
    [ 値4, 値5, 値6 ],
    [ 値7, 値8, 値9 ]
    ...
]

2〜4行目は各行が1つ1つの配列になっています。

さらにその中に配列を記述して、3次元、4次元と次元数を増やすことが可能です。

サンプル

<?php

___ih_hl_start
$fruits = [
    [
        'name'  => 'Apple',
        'price' => 150
    ],
    [
        'name'  => 'Orange',
        'price' => 100
    ],
    [
        'name'  => 'Melon',
        'price' => 2300
    ]
];
___ih_hl_end

var_dump($fruits);

?>
$ php sample.php
array(3) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "Apple"
    ["price"]=>
    int(150)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(6) "Orange"
    ["price"]=>
    int(100)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(5) "Melon"
    ["price"]=>
    int(2300)
  }
}

$fruitsは3つの配列を記憶する多次元配列です。

また、その3つの配列はそれぞれ連想配列になっています。

値の取得

多次元配列の値を取得するには次元ごとのキーを指定します。

基本構文

変数[キー1][キー2]...

取得する値までの[キー]を次元ごとに繋げて記述します。

サンプル

<?php

$fruits = [
    [
        'name'  => 'Apple',
        'price' => 150
    ],
    [
        'name'  => 'Orange',
        'price' => 100
    ],
    [
        'name'  => 'Melon',
        'price' => 2300
    ]
];

___ih_hl_start
echo $fruits[0]['name'];
___ih_hl_end

?>
$ php sample.php
Apple

18行目の$fruits[0]['name']で多次元配列の値を取得しています。

このコードを1つずつ解釈すると次のようになります。

No コード 解釈
1 $fruits 変数$fruitsを取得
2 $fruits[0] 変数$fruitsのキー0の値を取得。
→ 配列[ 'name' => 'Apple', 'price' => 150]
3 $fruits[0]['name'] No.2で取得した配列のキー'name'の値を取得
'Apple'

1つずつ次元を辿ることで、次元数が多い多次元配列でも扱えるようになります。

値の記憶

多次元配列の値を記憶するには取得の時と同様に次元ごとのキーを指定して値を代入します。

基本構文

変数[キー1][キー2] = 値

既に同じキーが存在する場合は値を上書きし、存在しない場合は新しい記憶領域に指定したキーで値を記憶します。

サンプル

<?php

$fruits = [
    [
        'name'  => 'Apple',
        'price' => 150
    ],
    [
        'name'  => 'Orange',
        'price' => 100
    ],
    [
        'name'  => 'Melon',
        'price' => 2300
    ]
];

var_dump($fruits);

___ih_hl_start
$fruits[1]['price'] = 200;
$fruits[] = [
    'name'  => 'Pineapple',
    'price' => 1200
];
___ih_hl_end

echo "-------------------------\n";

var_dump($fruits);

?>
$ php sample.php
array(3) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "Apple"
    ["price"]=>
    int(150)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(6) "Orange"
    ["price"]=>
    int(100)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(5) "Melon"
    ["price"]=>
    int(2300)
  }
}
-------------------------
array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "Apple"
    ["price"]=>
    int(150)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(6) "Orange"
    ["price"]=>
    int(200)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(5) "Melon"
    ["price"]=>
    int(2300)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(9) "Pineapple"
    ["price"]=>
    int(1200)
  }
}

20行目と21〜24行目で多次元配列に値を代入しています。

20行目のコードを1つずつ解釈すると次のようになります。

No コード 解釈
1 $fruits 変数$fruits
2 $fruits[1] 変数$fruitsのキー1の値。
→ 配列[ 'name' => 'Orange', 'price' => 100]
3 $fruits[1]['price'] No.2で取得した配列のキー'price'
4 $fruits[1]['price'] = 200 No.3の部分に200を代入

21〜24行目のコードは次のような解釈です。

No コード 解釈
1 $fruits 変数$fruits
2 $fruits[] = 値 変数$fruitsに値を追加。
3 $fruits[] = [ 'name' => 'Pineapple', 'price' => 1200 ]; 値は[ 'name' => 'Pineapple', 'price' => 1200 ]

1回目と2回目のvar_dump関数の出力を比較すると、値の上書き、追加ができたことが分かります。