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
東京
ただし、実務ではすべての値を機械的に表示するよりも、name や age のようなキーを指定して表示することが多いです。
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() を使うと、101、102、103 といったキーは保持されず、0、1、2 のように振り直されます。
キーを保持したまま並び替えたい場合は、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"];
}
実務では、数値添字よりも連想配列を使うことが多いです。
連想配列を使うと、name、age、price のように値の意味が明確になり、読みやすく保守しやすいコードになります。
また、実務で使う場合は、次の点にも注意しましょう。
- 存在しないキーにアクセスしないように
??を使う - HTMLに出力するときは
htmlspecialchars()を使う array_filter()はキーを保持するため、必要ならarray_values()を使うusort()はキーを振り直すため、キーを保持したい場合はuasort()を使う- JSON変換やJSONデコードでは、必要に応じてエラー処理を行う
まずは、「外側の配列が複数件のデータを持ち、内側の配列が1件分の詳細を持つ」というイメージで理解すると、PHPの2次元配列はかなり分かりやすくなります。
以上、PHPの2次元配列についてでした。
最後までお読みいただき、ありがとうございました。










