PHPの2次元配列について

採用はこちら

PHPの2次元配列とは、簡単に言うと「配列の中に配列が入っている構造」のことです。

たとえば、ユーザー一覧、商品一覧、注文一覧のように、複数件のデータをまとめて扱いたいときによく使います。

厳密に言うと、PHPに「2次元配列」という専用の型があるわけではありません。

PHPでは、配列の要素として別の配列を入れることができます。

このような入れ子になった配列を、一般的に「2次元配列」や「ネストした配列」と呼びます。

たとえば、次のような配列が2次元配列です。

$users = [
    ["田中", 25, "東京"],
    ["佐藤", 30, "大阪"],
    ["鈴木", 28, "福岡"]
];

この配列は、表のように考えると分かりやすいです。

| 名前 | 年齢 | 出身 |
| — | -: | — |
| 田中 | 25 | 東京 |
| 佐藤 | 30 | 大阪 |
| 鈴木 | 28 | 福岡 |

外側の配列には、複数人分のデータが入っています。

内側の配列には、1人分の情報が入っています。

つまり、次のようなイメージです。

$users = [
    0 => ["田中", 25, "東京"],
    1 => ["佐藤", 30, "大阪"],
    2 => ["鈴木", 28, "福岡"]
];

$users[0] には、1人目の情報が配列として入っています。

["田中", 25, "東京"]

そして、$users[0][0] と書くと、1人目の配列の中にある最初の値を取り出せます。

echo $users[0][0]; // 田中
目次

PHPの通常の配列と2次元配列の違い

通常の配列

まず、通常の1次元配列を確認しておきましょう。

$fruits = ["apple", "banana", "orange"];

echo $fruits[0]; // apple
echo $fruits[1]; // banana
echo $fruits[2]; // orange

この配列は、1つの配列の中に値が並んでいるだけです。

| 添字 | 値 |
| -: | —— |
| 0 | apple |
| 1 | banana |
| 2 | orange |

このような配列は、1次元配列と考えることができます。

2次元配列

一方、2次元配列では、配列の中にさらに配列が入ります。

$users = [
    ["田中", 25, "東京"],
    ["佐藤", 30, "大阪"],
    ["鈴木", 28, "福岡"]
];

この場合、$users[0] は単なる文字列や数値ではなく、配列です。

print_r($users[0]);

出力イメージは次のようになります。

Array
(
    [0] => 田中
    [1] => 25
    [2] => 東京
)

つまり、2次元配列では、外側の配列から1件分のデータを取り出し、その中からさらに特定の値を取り出します。

2次元配列の値を取り出す方法

数値添字で値を取り出す

2次元配列の値を取り出すには、次のように書きます。

$配列名[何件目][どの項目]

たとえば、次の配列を見てみましょう。

$users = [
    ["田中", 25, "東京"],
    ["佐藤", 30, "大阪"],
    ["鈴木", 28, "福岡"]
];

1人目の名前を取り出す場合は、次のように書きます。

echo $users[0][0]; // 田中

1人目の年齢を取り出す場合は、次のように書きます。

echo $users[0][1]; // 25

2人目の出身地を取り出す場合は、次のように書きます。

echo $users[1][2]; // 大阪

ここで注意したいのは、PHPの配列の添字は基本的に 0 から始まるという点です。

そのため、1人目は [0]、2人目は [1]、3人目は [2] になります。

$users[0][0] の意味

$users[0][0] という書き方は、最初は少し分かりにくいかもしれません。

分解すると、まず次の部分があります。

$users[0]

これは、1人目のデータを表します。

["田中", 25, "東京"]

そして、さらに [0] を指定します。

$users[0][0]

これは、1人目のデータの中にある0番目の値を表します。

つまり、結果は次のようになります。

田中

連想配列を使った2次元配列

実務では連想配列がよく使われる

PHPの2次元配列では、数値添字だけでなく、連想配列を使うこともできます。

実務では、次のような連想配列形式の2次元配列がよく使われます。

$users = [
    [
        "name" => "田中",
        "age" => 25,
        "city" => "東京"
    ],
    [
        "name" => "佐藤",
        "age" => 30,
        "city" => "大阪"
    ],
    [
        "name" => "鈴木",
        "age" => 28,
        "city" => "福岡"
    ]
];

この形にすると、値の意味が分かりやすくなります。

たとえば、数値添字の場合は次のようになります。

echo $users[0][1];

このコードだけを見ると、[1] が何を意味しているのか少し分かりにくいです。

一方、連想配列であれば次のように書けます。

echo $users[0]["age"];

この場合、age と書かれているため、年齢を取り出していることがすぐに分かります。

連想配列の値を取り出す

連想配列を使った2次元配列では、次のように値を取り出します。

echo $users[0]["name"]; // 田中
echo $users[0]["age"];  // 25
echo $users[0]["city"]; // 東京

2人目の名前を取り出す場合は、次のように書きます。

echo $users[1]["name"]; // 佐藤

3人目の出身地を取り出す場合は、次のように書きます。

echo $users[2]["city"]; // 福岡

このように、連想配列を使うと、コードの意味が明確になります。

foreachで2次元配列を処理する

foreachで1件ずつ取り出す

2次元配列は、foreach と組み合わせて使うことが多いです。

たとえば、ユーザー一覧を1件ずつ表示する場合は、次のように書けます。

$users = [
    [
        "name" => "田中",
        "age" => 25,
        "city" => "東京"
    ],
    [
        "name" => "佐藤",
        "age" => 30,
        "city" => "大阪"
    ],
    [
        "name" => "鈴木",
        "age" => 28,
        "city" => "福岡"
    ]
];

foreach ($users as $user) {
    echo $user["name"] . "さんは" . $user["age"] . "歳で、" . $user["city"] . "出身です。";
    echo "<br>";
}

出力結果は次のようになります。

田中さんは25歳で、東京出身です。
佐藤さんは30歳で、大阪出身です。
鈴木さんは28歳で、福岡出身です。

foreach ($users as $user) では、外側の配列から1件分のデータを順番に取り出しています。

1回目のループでは、$user に次の配列が入ります。

[
    "name" => "田中",
    "age" => 25,
    "city" => "東京"
]

2回目のループでは、$user に次の配列が入ります。

[
    "name" => "佐藤",
    "age" => 30,
    "city" => "大阪"
]

このように、2次元配列では「外側の配列をループして、内側の配列から値を取り出す」という流れが基本になります。

foreachを二重に使う

配列の中身をすべて順番に表示したい場合は、foreach を二重に使うこともできます。

$users = [
    ["田中", 25, "東京"],
    ["佐藤", 30, "大阪"],
    ["鈴木", 28, "福岡"]
];

foreach ($users as $user) {
    foreach ($user as $value) {
        echo $value . " ";
    }
    echo "<br>";
}

出力結果は次のようになります。

田中 25 東京
佐藤 30 大阪
鈴木 28 福岡

外側の foreach は、1人分の配列を取り出します。

["田中", 25, "東京"]

内側の foreach は、その中の値を1つずつ取り出します。

田中
25
東京

ただし、実務ではすべての値を機械的に表示するよりも、nameage のようなキーを指定して表示することが多いです。

2次元配列にデータを追加する

末尾にデータを追加する

2次元配列に新しいデータを追加するには、$array[] = ... という書き方を使います。

$users = [
    [
        "name" => "田中",
        "age" => 25,
        "city" => "東京"
    ],
    [
        "name" => "佐藤",
        "age" => 30,
        "city" => "大阪"
    ]
];

$users[] = [
    "name" => "鈴木",
    "age" => 28,
    "city" => "福岡"
];

print_r($users);

$users[] = ... と書くと、配列の最後に新しい要素が追加されます。

追加後のイメージは次のようになります。

$users = [
    [
        "name" => "田中",
        "age" => 25,
        "city" => "東京"
    ],
    [
        "name" => "佐藤",
        "age" => 30,
        "city" => "大阪"
    ],
    [
        "name" => "鈴木",
        "age" => 28,
        "city" => "福岡"
    ]
];

キーを指定して追加する

IDなどをキーにして管理したい場合は、外側の配列にもキーを指定できます。

$users = [];

$users[101] = [
    "name" => "田中",
    "age" => 25
];

$users[102] = [
    "name" => "佐藤",
    "age" => 30
];

この場合、次のようにIDを指定してデータを取り出せます。

echo $users[102]["name"]; // 佐藤

ユーザーIDや商品IDをキーにしたい場合に便利です。

2次元配列の値を変更する

特定の値を変更する

2次元配列の値を変更するには、変更したい場所を指定して代入します。

$users = [
    [
        "name" => "田中",
        "age" => 25,
        "city" => "東京"
    ],
    [
        "name" => "佐藤",
        "age" => 30,
        "city" => "大阪"
    ]
];

$users[0]["age"] = 26;

echo $users[0]["age"]; // 26

この例では、1人目のユーザーである田中さんの年齢を 25 から 26 に変更しています。

ループの中で値を変更する場合

foreach の中で配列の値を変更したい場合は、参照を使う方法があります。

foreach ($users as &$user) {
    $user["age"] += 1;
}

unset($user);

このコードでは、すべてのユーザーの年齢を1つ増やしています。

ただし、参照を使った foreach の後は、最後に unset($user); を書くのが安全です。

参照が残ったままだと、その後の処理で思わぬ不具合の原因になることがあります。

2次元配列の要素を削除する

unsetで削除する

2次元配列の要素を削除するには、unset() を使います。

$users = [
    [
        "name" => "田中",
        "age" => 25,
        "city" => "東京"
    ],
    [
        "name" => "佐藤",
        "age" => 30,
        "city" => "大阪"
    ],
    [
        "name" => "鈴木",
        "age" => 28,
        "city" => "福岡"
    ]
];

unset($users[1]);

print_r($users);

この場合、2人目の佐藤さんのデータが削除されます。

ただし、unset() で削除しても、数値添字は自動的に詰め直されません。

出力イメージは次のようになります。

Array
(
    [0] => Array
        (
            [name] => 田中
            [age] => 25
            [city] => 東京
        )

    [2] => Array
        (
            [name] => 鈴木
            [age] => 28
            [city] => 福岡
        )
)

[1] が削除され、[0][2] が残ります。

array_valuesで添字を詰め直す

削除後に添字を 0, 1, 2... のように振り直したい場合は、array_values() を使います。

$users = array_values($users);

これにより、配列のキーが振り直されます。

Array
(
    [0] => Array
        (
            [name] => 田中
            [age] => 25
            [city] => 東京
        )

    [1] => Array
        (
            [name] => 鈴木
            [age] => 28
            [city] => 福岡
        )
)

数値添字の配列として扱い続けたい場合は、unset() の後に array_values() を使うと分かりやすいです。

2次元配列をHTMLテーブルで表示する

基本的なHTMLテーブル表示

2次元配列は、HTMLのテーブル表示と相性が良いです。

$users = [
    [
        "name" => "田中",
        "age" => 25,
        "city" => "東京"
    ],
    [
        "name" => "佐藤",
        "age" => 30,
        "city" => "大阪"
    ],
    [
        "name" => "鈴木",
        "age" => 28,
        "city" => "福岡"
    ]
];
?>

<table border="1">
    <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>出身</th>
    </tr>

    <?php foreach ($users as $user): ?>
        <tr>
            <td><?php echo $user["name"]; ?></td>
            <td><?php echo $user["age"]; ?></td>
            <td><?php echo $user["city"]; ?></td>
        </tr>
    <?php endforeach; ?>
</table>

このように、配列の各要素を1行ずつ表示すれば、一覧表を作ることができます。

実務ではhtmlspecialcharsを使う

ただし、実務ではHTMLに値を出力するとき、基本的に htmlspecialchars() を使うことをおすすめします。

<td><?php echo htmlspecialchars($user["name"], ENT_QUOTES, "UTF-8"); ?></td>
<td><?php echo htmlspecialchars((string)$user["age"], ENT_QUOTES, "UTF-8"); ?></td>
<td><?php echo htmlspecialchars($user["city"], ENT_QUOTES, "UTF-8"); ?></td>

ユーザー入力や外部データをそのままHTMLに出力すると、意図しないHTMLタグやスクリプトが実行される危険があります。

たとえば、次のような文字列がデータに入っていた場合を考えます。

<script>alert('xss')</script>

これをそのまま出力すると危険です。

そのため、画面に表示するときは次のようにエスケープします。

echo htmlspecialchars($value, ENT_QUOTES, "UTF-8");

学習用のサンプルでは省略されることもありますが、実務では重要なポイントです。

実務でよく使う2次元配列の例

商品一覧の配列

WebサイトやECサイトでは、商品一覧を2次元配列で扱うことがあります。

$products = [
    [
        "id" => 1,
        "name" => "Tシャツ",
        "price" => 2980,
        "stock" => 12
    ],
    [
        "id" => 2,
        "name" => "スニーカー",
        "price" => 8900,
        "stock" => 5
    ],
    [
        "id" => 3,
        "name" => "キャップ",
        "price" => 1980,
        "stock" => 20
    ]
];

このような配列では、1つの内側の配列が1商品分のデータを表します。

一覧表示する場合は、次のように書けます。

foreach ($products as $product) {
    echo $product["name"] . ":";
    echo number_format($product["price"]) . "円";
    echo "<br>";
}

出力結果は次のようになります。

Tシャツ:2,980円
スニーカー:8,900円
キャップ:1,980円

条件に合うデータだけ表示する

2次元配列では、条件分岐と組み合わせて、条件に合うデータだけを表示することもよくあります。

たとえば、在庫が10個以上の商品だけを表示する場合は、次のように書けます。

foreach ($products as $product) {
    if ($product["stock"] >= 10) {
        echo $product["name"] . "は在庫があります。";
        echo "<br>";
    }
}

出力結果は次のようになります。

Tシャツは在庫があります。
キャップは在庫があります。

このように、2次元配列は「一覧データを持つ」「条件に合うものだけ処理する」といった場面でよく使われます。

2次元配列で合計を計算する

foreachで合計する

商品価格の合計を出す場合は、次のように書けます。

$products = [
    [
        "name" => "Tシャツ",
        "price" => 2980
    ],
    [
        "name" => "スニーカー",
        "price" => 8900
    ],
    [
        "name" => "キャップ",
        "price" => 1980
    ]
];

$total = 0;

foreach ($products as $product) {
    $total += $product["price"];
}

echo "合計金額は" . number_format($total) . "円です。";

出力結果は次のようになります。

合計金額は13,860円です。

$total += $product["price"]; は、次のコードと同じ意味です。

$total = $total + $product["price"];

ループのたびに価格を加算していき、最後に合計金額を表示しています。

array_reduceで合計する

array_reduce() を使って合計を計算することもできます。

$total = array_reduce($products, function ($carry, $product) {
    return $carry + $product["price"];
}, 0);

echo $total;

$carry には、前回までの計算結果が入ります。

最後の 0 は初期値です。

初心者のうちは foreach のほうが分かりやすいですが、関数型の書き方に慣れてくると array_reduce() も便利です。

2次元配列から特定のデータを探す

foreachで検索する

2次元配列の中から、特定のデータを探すこともできます。

たとえば、IDが 2 の商品を探す場合は、次のように書けます。

$products = [
    [
        "id" => 1,
        "name" => "Tシャツ",
        "price" => 2980
    ],
    [
        "id" => 2,
        "name" => "スニーカー",
        "price" => 8900
    ],
    [
        "id" => 3,
        "name" => "キャップ",
        "price" => 1980
    ]
];

foreach ($products as $product) {
    if ($product["id"] === 2) {
        echo $product["name"];
        break;
    }
}

出力結果は次のようになります。

スニーカー

break は、目的のデータが見つかった時点でループを終了するために使います。

検索対象が見つかったあともループを続ける必要がない場合は、break を使うと無駄な処理を減らせます。

array_columnで特定の列だけ取り出す

指定したキーの値を一覧で取り出す

2次元配列から、特定の項目だけを取り出したい場合は、array_column() が便利です。

$users = [
    [
        "name" => "田中",
        "age" => 25
    ],
    [
        "name" => "佐藤",
        "age" => 30
    ],
    [
        "name" => "鈴木",
        "age" => 28
    ]
];

$names = array_column($users, "name");

print_r($names);

出力結果は次のようになります。

Array
(
    [0] => 田中
    [1] => 佐藤
    [2] => 鈴木
)

年齢だけを取り出したい場合は、次のように書きます。

$ages = array_column($users, "age");

IDをキーにして取り出す

array_column() は、第3引数を指定すると、結果の配列のキーを設定できます。

$users = [
    [
        "id" => 1,
        "name" => "田中"
    ],
    [
        "id" => 2,
        "name" => "佐藤"
    ]
];

$names = array_column($users, "name", "id");

print_r($names);

出力結果は次のようになります。

Array
(
    [1] => 田中
    [2] => 佐藤
)

IDをキーにしてデータを扱いたい場合に便利です。

array_mapで2次元配列を加工する

配列の各要素を変換する

配列の中身を加工したい場合は、array_map() を使うことがあります。

たとえば、商品名だけを取り出す場合は、次のように書けます。

$products = [
    [
        "name" => "Tシャツ",
        "price" => 2980
    ],
    [
        "name" => "スニーカー",
        "price" => 8900
    ]
];

$productNames = array_map(function ($product) {
    return $product["name"];
}, $products);

print_r($productNames);

出力結果は次のようになります。

Array
(
    [0] => Tシャツ
    [1] => スニーカー
)

array_map() は、配列の各要素に対して同じ処理を行い、その結果を新しい配列として返します。

array_filterで2次元配列を絞り込む

条件に合う要素だけ残す

条件に合うデータだけを残したい場合は、array_filter() を使えます。

$products = [
    [
        "name" => "Tシャツ",
        "price" => 2980,
        "stock" => 12
    ],
    [
        "name" => "スニーカー",
        "price" => 8900,
        "stock" => 5
    ],
    [
        "name" => "キャップ",
        "price" => 1980,
        "stock" => 20
    ]
];

$inStockProducts = array_filter($products, function ($product) {
    return $product["stock"] >= 10;
});

print_r($inStockProducts);

この場合、在庫が10個以上の商品だけが残ります。

array_filterはキーを保持する

array_filter() を使うときは、元のキーが保持される点に注意が必要です。

先ほどの例では、2番目の商品であるスニーカーが除外されます。

そのため、結果は次のようなイメージになります。

Array
(
    [0] => Array
        (
            [name] => Tシャツ
            [price] => 2980
            [stock] => 12
        )

    [2] => Array
        (
            [name] => キャップ
            [price] => 1980
            [stock] => 20
        )
)

[1] が抜けた状態になります。

添字を 0, 1, 2... のように振り直したい場合は、array_values() を組み合わせます。

$inStockProducts = array_values(array_filter($products, function ($product) {
    return $product["stock"] >= 10;
}));

JSONとして返す場合や、JavaScript側で配列として扱いやすくしたい場合は、array_values() を使うと安全です。

2次元配列をソートする

usortで並び替える

2次元配列を特定の項目で並び替えたい場合は、usort() を使えます。

たとえば、商品を価格の安い順に並び替える場合は、次のように書きます。

$products = [
    [
        "name" => "Tシャツ",
        "price" => 2980
    ],
    [
        "name" => "スニーカー",
        "price" => 8900
    ],
    [
        "name" => "キャップ",
        "price" => 1980
    ]
];

usort($products, function ($a, $b) {
    return $a["price"] <=> $b["price"];
});

print_r($products);

<=> は宇宙船演算子と呼ばれる比較演算子です。

左側が小さい場合は負の値、同じ場合は 0、左側が大きい場合は正の値を返します。

昇順にしたい場合は、次のように書きます。

return $a["price"] <=> $b["price"];

降順にしたい場合は、左右を逆にします。

return $b["price"] <=> $a["price"];

usortはキーを振り直す

usort() を使うと、配列のキーは振り直されます。

通常の商品一覧のように、単純な数値添字配列であれば問題になることは少ないです。

しかし、次のようにIDをキーにしている配列では注意が必要です。

$users = [
    101 => [
        "name" => "田中",
        "age" => 25
    ],
    102 => [
        "name" => "佐藤",
        "age" => 30
    ],
    103 => [
        "name" => "鈴木",
        "age" => 28
    ]
];

この配列に usort() を使うと、101102103 といったキーは保持されず、012 のように振り直されます。

キーを保持したまま並び替えたい場合は、uasort() を使います。

uasort($users, function ($a, $b) {
    return $a["age"] <=> $b["age"];
});

IDなどをキーとして使っている場合は、usort()uasort() の違いを意識しましょう。

2次元配列とJSON

2次元配列をJSONに変換する

APIやJavaScriptとの連携では、PHPの2次元配列をJSONに変換することがあります。

$users = [
    [
        "name" => "田中",
        "age" => 25
    ],
    [
        "name" => "佐藤",
        "age" => 30
    ]
];

$json = json_encode($users, JSON_UNESCAPED_UNICODE);

echo $json;

出力結果は次のようになります。

[{"name":"田中","age":25},{"name":"佐藤","age":30}]

JSON_UNESCAPED_UNICODE を指定すると、日本語がUnicodeエスケープされず、そのまま表示されます。

指定しない場合、日本語が次のような形で表示されることがあります。

"\u7530\u4e2d"

そのため、日本語を読みやすく出力したい場合は、JSON_UNESCAPED_UNICODE を使うと便利です。

JSON変換の失敗に注意する

実務では、json_encode() が失敗する可能性も考慮すると安全です。

$json = json_encode($users, JSON_UNESCAPED_UNICODE);

if ($json === false) {
    echo "JSON変換に失敗しました";
}

PHP 7.3以降では、JSON_THROW_ON_ERROR を使って例外として扱う方法もあります。

$json = json_encode($users, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);

学習用のコードでは省略されることも多いですが、実務ではエラー処理も意識しておくとよいです。

JSONから2次元配列に戻す

JSON文字列をPHPの配列に戻すには、json_decode() を使います。

$json = '[{"name":"田中","age":25},{"name":"佐藤","age":30}]';

$users = json_decode($json, true);

echo $users[0]["name"]; // 田中

第2引数に true を指定すると、JSONオブジェクトがPHPの連想配列として変換されます。

true を指定しない場合は、オブジェクトとして扱われます。

$users = json_decode($json);

echo $users[0]->name;

配列として扱いたい場合は、基本的に次のように書きます。

$users = json_decode($json, true);

よくあるエラーと注意点

Undefined array key

存在しないキーにアクセスすると、Undefined array key のような警告が出ることがあります。

たとえば、次の配列には city というキーがありません。

$users = [
    [
        "name" => "田中",
        "age" => 25
    ]
];

echo $users[0]["city"];

この場合、city が存在しないため警告が出ます。

安全に取り出したい場合は、Null合体演算子 ?? を使います。

echo $users[0]["city"] ?? "未設定";

これは、city が存在すればその値を表示し、存在しなければ "未設定" を表示するという意味です。

実務では、外部APIやフォーム入力など、常に想定どおりのキーが存在するとは限りません。

そのため、必要に応じて ?? を使うと安全です。

配列かどうか確認する

データ構造が不確かな場合は、is_array() で配列かどうかを確認できます。

if (is_array($users[0])) {
    echo "配列です";
}

外部データを扱う場合、想定外の形式になっている可能性もあります。

そのような場合は、値を使う前に型を確認するとエラーを防ぎやすくなります。

print_rを見やすく表示する

配列の中身を確認したい場合は、print_r() が便利です。

print_r($users);

ただし、ブラウザ上では改行やインデントが見づらくなることがあります。

その場合は、次のように <pre> タグで囲むと見やすくなります。

echo "<pre>";
print_r($users);
echo "</pre>";

デバッグ目的で詳しい情報を確認したい場合は、var_dump() も使えます。

var_dump($users);

2次元配列を使う場面

ユーザー一覧

2次元配列は、ユーザー一覧のようなデータに向いています。

$users = [
    [
        "id" => 1,
        "name" => "田中",
        "email" => "tanaka@example.com"
    ],
    [
        "id" => 2,
        "name" => "佐藤",
        "email" => "sato@example.com"
    ]
];

商品一覧

商品一覧でもよく使われます。

$products = [
    [
        "id" => 1,
        "name" => "Tシャツ",
        "price" => 2980
    ],
    [
        "id" => 2,
        "name" => "スニーカー",
        "price" => 8900
    ]
];

DB取得結果

データベースから複数行のデータを取得した場合も、2次元配列のような形になることが多いです。

たとえば、PDOで次のように取得した場合です。

$stmt = $pdo->query("SELECT id, name, price FROM products");
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);

取得結果は、次のような配列になります。

[
    [
        "id" => 1,
        "name" => "Tシャツ",
        "price" => 2980
    ],
    [
        "id" => 2,
        "name" => "スニーカー",
        "price" => 8900
    ]
]

ただし、取得方法によっては、数値添字と連想添字が両方入ったり、オブジェクト形式になったりすることもあります。

そのため、DB取得結果を扱うときは、どの形式で取得しているかを確認することが大切です。

数値添字と連想配列のどちらを使うべきか

学習用なら数値添字でもよい

学習用であれば、次のような数値添字の2次元配列でも問題ありません。

$users = [
    ["田中", 25, "東京"],
    ["佐藤", 30, "大阪"]
];

この形はシンプルなので、2次元配列の基本を理解するには向いています。

実務では連想配列が分かりやすい

実務では、連想配列を使うことが多いです。

$users = [
    [
        "name" => "田中",
        "age" => 25,
        "city" => "東京"
    ],
    [
        "name" => "佐藤",
        "age" => 30,
        "city" => "大阪"
    ]
];

理由は、何の値を扱っているか分かりやすいからです。

echo $user[1];

よりも、

echo $user["age"];

のほうが、年齢を表示していることが明確です。

コードは自分だけでなく、後から他の人が読むこともあります。

そのため、意味が分かりやすい連想配列を使うほうが、保守しやすいコードになります。

PHPの2次元配列で覚えておきたいポイント

基本の考え方

PHPの2次元配列は、次のように考えると分かりやすいです。

$配列名[何件目][どの項目]

たとえば、次のコードを見てみましょう。

echo $users[1]["city"];

これは、次の意味になります。

users の 2件目の city を取り出す

PHPの配列は0番目から始まるため、[1] は2件目を意味します。

外側の配列と内側の配列を分けて考える

2次元配列では、外側の配列と内側の配列を分けて考えることが大切です。

$users = [
    [
        "name" => "田中",
        "age" => 25
    ],
    [
        "name" => "佐藤",
        "age" => 30
    ]
];

この場合、外側の配列は「ユーザー一覧」です。

$users

内側の配列は「1人分のユーザー情報」です。

$users[0]

特定の項目を取り出すには、さらにキーを指定します。

$users[0]["name"]

この考え方を理解すると、2次元配列はかなり扱いやすくなります。

まとめ

PHPの2次元配列とは、配列の中に配列が入っている構造のことです。

厳密には「ネストした配列」と考えるとよいでしょう。

2次元配列は、次のような場面でよく使います。

用途
ユーザー一覧名前、年齢、メールアドレス
商品一覧商品名、価格、在庫数
お問い合わせ一覧名前、本文、送信日時
DB取得結果複数レコードの取得結果
APIレスポンスJSONを配列化したデータ

基本形は次のとおりです。

$data = [
    [
        "key1" => "value1",
        "key2" => "value2"
    ],
    [
        "key1" => "value3",
        "key2" => "value4"
    ]
];

値を取り出すときは、次のように書きます。

$data[0]["key1"];

ループで表示するときは、次のように書きます。

foreach ($data as $item) {
    echo $item["key1"];
}

実務では、数値添字よりも連想配列を使うことが多いです。

連想配列を使うと、nameageprice のように値の意味が明確になり、読みやすく保守しやすいコードになります。

また、実務で使う場合は、次の点にも注意しましょう。

  • 存在しないキーにアクセスしないように ?? を使う
  • HTMLに出力するときは htmlspecialchars() を使う
  • array_filter() はキーを保持するため、必要なら array_values() を使う
  • usort() はキーを振り直すため、キーを保持したい場合は uasort() を使う
  • JSON変換やJSONデコードでは、必要に応じてエラー処理を行う

まずは、「外側の配列が複数件のデータを持ち、内側の配列が1件分の詳細を持つ」というイメージで理解すると、PHPの2次元配列はかなり分かりやすくなります。

以上、PHPの2次元配列についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次