【PHP】レッスン4-07:配列の多次元化を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:配列の多次元化

この記事の練習問題を解くために必要な知識:
基礎文法・制御構造・関数(レッスン1~3)配列の基本キーが文字列の配列配列の要素の追加と削除配列の調査配列の操作配列の並び替え配列の多次元化

PHPでは配列を使って複数のデータを一つの変数に格納できますが、さらに配列の中に別の配列を格納することで「多次元配列」を作成できます。

これにより表形式やツリー構造のデータを扱うことが可能になります。

本記事では多次元配列の基本概念と使用例を紹介し、初心者でも理解できるように解説します。

<<前のページ PHP記事一覧 次のページ>>

PHPの多次元配列とは?

多次元配列とは配列の要素に別の配列が含まれている配列のことです。

たとえば表形式のデータや階層構造のデータを管理する際に便利です。

例:
生徒ごとの成績を管理する場合、各生徒の情報を配列にまとめ、その配列をさらに配列に格納します。これによりデータのグループ化やアクセスが容易になります。

多次元配列の基本構文

PHPでは、多次元配列は次のように定義します。

<?php
// 多次元配列の宣言
$students = [
    ["名前" => "田中", "数学" => 80, "英語" => 70],
    ["名前" => "佐藤", "数学" => 85, "英語" => 75],
    ["名前" => "鈴木", "数学" => 90, "英語" => 88],
];

// 配列の要素へのアクセス
echo $students[ 0]["名前"] . PHP_EOL; // 田中
echo $students[ 1]["英語"] . PHP_EOL; // 75
  • [] で配列を定義します。
  • 各要素はキーと値のペアで管理されています(連想配列)。
  • 要素へアクセスする際には、インデックスとキーを使います。

多次元配列の使用例

以下は、多次元配列を使った具体例です。

例1: 表データの管理

<?php
// 従業員データ
$employees = [
    ["ID" => 101, "名前" => "山田", "役職" => "課長"],
    ["ID" => 102, "名前" => "高橋", "役職" => "主任"],
    ["ID" => 103, "名前" => "中村", "役職" => "社員"]
];

// データ表示
foreach ($employees as $employee) {
    echo "ID: " . $employee["ID"] . PHP_EOL;
    echo "名前: " . $employee["名前"] . PHP_EOL;
    echo "役職: " . $employee["役職"] . PHP_EOL;
    echo "-------------" . PHP_EOL;
}

このコードを実行すると以下のように出力されます。

ID: 101
名前: 山田
役職: 課長
-------------
ID: 102
名前: 高橋
役職: 主任
-------------
ID: 103
名前: 中村
役職: 社員
-------------

例2: ネストされた配列の処理

<?php
$matrix = [
    [ 1, 2, 3],
    [ 4, 5, 6],
    [ 7, 8, 9]
];

// 二重ループを使ったアクセス
foreach ($matrix as $row) {
    foreach ($row as $value) {
        echo $value . " ";
    }
    echo PHP_EOL;
}

このコードを実行すると以下のように出力されます。

1 2 3 
4 5 6 
7 8 9

多次元配列の操作

多次元配列の要素を追加・削除する例を紹介します。

要素の追加

多次元配列に要素を追加するには、特定のインデックスを指定して新しい値を代入します。

例1: 行(配列全体)の追加

<?php
$colors = [
    ["赤", "青"],
    ["緑", "黄"]
];

// 新しい行(配列)を追加
$colors[] = ["白", "黒"];

print_r($colors);

このコードを実行すると以下のように出力されます。

Array
(
    [ 0] => Array
        (
            [ 0] => 赤
            [ 1] => 青
        )
    [ 1] => Array
        (
            [ 0] => 緑
            [ 1] => 黄
        )
    [ 2] => Array
        (
            [ 0] => 白
            [ 1] => 黒
        )
)
  • $colors[] = [...] は配列の末尾に新しい行(配列)を追加します。
  • インデックスを指定しなくても、自動的に次の番号が割り当てられます。

例2: 列(要素)の追加

<?php
// 配列の指定した行に新しい要素を追加
$colors[ 1][] = "紫";

print_r($colors);

このコードを実行すると以下のように出力されます。

Array
(
    [ 0] => Array
        (
            [ 0] => 赤
            [ 1] => 青
        )
    [ 1] => Array
        (
            [ 0] => 緑
            [ 1] => 黄
            [ 2] => 紫
        )
)
  • $colors[ 1][] = "紫"; は、指定した行(2行目)に新しい要素「紫」を追加します。
  • 要素のインデックス番号は自動的に付与されます。

要素の削除

PHPでは、unset() 関数を使用して要素を削除できます。

例1: 要素の削除

<?php
unset($colors[ 1][ 1]); // 2行目の2番目の要素(黄)を削除
print_r($colors);

このコードを実行すると以下のように出力されます。

Array
(
    [ 0] => Array
        (
            [ 0] => 赤
            [ 1] => 青
        )
    [ 1] => Array
        (
            [ 0] => 緑
            [ 2] => 紫
        )
)
  • unset() は指定した要素のみを削除します。
  • 削除された後もインデックスはそのまま保持されるため、注意が必要です([ 1] => 緑[ 2] => 紫 の間に番号のズレが発生)。

例2: 行の削除

<?php
unset($colors[ 1]); // 2行目全体を削除
print_r($colors);

このコードを実行すると以下のように出力されます。

Array
(
    [ 0] => Array
        (
            [ 0] => 赤
            [ 1] => 青
        )
)
  • 行全体を削除する場合も unset() を使用します。
  • 配列のキー(インデックス番号)は再構成されません。順番を詰めるには後述のarray_values()を使います。

まとめ

多次元配列はデータを整理して扱いやすくするための重要な機能です。

特に表形式や階層構造のデータを扱う場合に役立ちます。

  • 基本構文: 配列[インデックス][キー] を使ってアクセスします。
  • 操作例: 要素の追加・削除、ネストされたループを使った処理が可能です。

これを理解することで、より複雑なデータ構造の操作が簡単に行えるようになります。

次のステップでは配列をさらに効率よく管理するための関数や操作方法について学習しましょう。

多次元配列の練習問題:データ管理プログラムを作成しよう

商品管理システムを作成しましょう。

このシステムでは、商品のID、名前、価格、在庫数を多次元配列で管理します。

商品一覧の表示、商品の追加、商品の検索機能を実装し、管理業務を効率化するためのプログラムを作成してください。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. 多次元配列による商品データの定義
    • 商品ID、名前、価格、在庫数を持つ多次元配列 $products を定義すること。
    • 初期データとして以下を含めること。
      商品ID: 101、名前: りんご、価格: 150円、在庫数: 20個
      商品ID: 102、名前: みかん、価格: 100円、在庫数: 35個
      商品ID: 103、名前: バナナ、価格: 200円、在庫数: 15個
  2. 商品一覧の表示機能
    • 関数 displayProducts() を作成し、商品データを表形式で出力すること。
    • 各商品のID、名前、価格、在庫数を表示すること。
  3. 商品の追加機能
    • 配列 $products に新しい商品(ID: 104、名前: ぶどう、価格: 300円、在庫数: 10個)を追加すること。
  4. 商品検索機能
    • 関数 searchProduct() を作成し、名前が部分一致する商品を検索できるようにすること。
    • 該当する商品が見つかった場合、その商品情報を表示すること。
    • 見つからなかった場合は「商品が見つかりませんでした」と表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

【商品一覧】
商品ID: 101
名前: りんご
価格: 150円
在庫数: 20個
-----------------------
商品ID: 102
名前: みかん
価格: 100円
在庫数: 35個
-----------------------
商品ID: 103
名前: バナナ
価格: 200円
在庫数: 15個
-----------------------
【追加後の商品一覧】
商品ID: 101
名前: りんご
価格: 150円
在庫数: 20個
-----------------------
商品ID: 102
名前: みかん
価格: 100円
在庫数: 35個
-----------------------
商品ID: 103
名前: バナナ
価格: 200円
在庫数: 15個
-----------------------
商品ID: 104
名前: ぶどう
価格: 300円
在庫数: 10個
-----------------------
検索結果:
名前: みかん
価格: 100円
在庫数: 35個

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:PHPコードの開始タグ
2:多次元配列$productsを定義し、商品情報(ID、名前、価格、在庫数)を格納
3:関数displayProductsを定義
  □ 引数$productsを受け取る
  □ foreach文を使い、$products配列を1行ずつ処理
  □ □ 各商品情報(ID、名前、価格、在庫数)を出力
  □ □ 区切り線を出力
4:関数searchProductを定義
  □ 引数$productsと$keywordを受け取る
  □ foreach文を使い、$products配列を1行ずつ処理
  □ □ 商品名に$keywordが部分一致するか判定
  □ □ 真の場合、その商品を返す
  □ 検索結果が見つからない場合はnullを返す
5:「【商品一覧】」と出力
6:displayProducts関数を呼び出し、商品一覧を表示
7:新商品$newProductを定義(ID、名前、価格、在庫数)
8:配列$productsに$newProductを追加
9:「【追加後の商品一覧】」と出力
10:displayProducts関数を再度呼び出し、商品一覧を表示
11:変数$keywordに「みかん」を設定
12:searchProduct関数を呼び出して、$keywordに一致する商品を検索
13:if文にて検索結果がnullでないか判定
  □ 真の場合、商品名、価格、在庫数を出力
  □ 偽の場合、「商品が見つかりませんでした。」と出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

<?php
// 多次元配列を使用した商品データの管理例

// 商品データを多次元配列で定義
/*
【穴埋め問題1】ここに商品データを格納する多次元配列を定義してください。
例: 商品ID、名前、価格、在庫数を含めた複数の商品を格納する。
*/

// 商品一覧を表示する関数
function displayProducts($products) {
    // 配列の内容を1行ずつ出力
    foreach ($products as $product) {
        echo "商品ID: " . $product["ID"] . PHP_EOL;
        echo "名前: " . $product["名前"] . PHP_EOL;
        echo "価格: " . $product["価格"] . "円" . PHP_EOL;
        echo "在庫数: " . $product["在庫数"] . "個" . PHP_EOL;
        echo "-----------------------" . PHP_EOL;
    }
}

// 商品の検索関数
function searchProduct($products, $keyword) {
    // 配列から条件に一致する商品を探す
    foreach ($products as $product) {
        if (strpos($product["名前"], $keyword) !== false) { // 部分一致で検索
            return $product; // 見つかった場合、その商品を返す
        }
    }
    return null; // 見つからなかった場合はnullを返す
}

// 商品一覧を表示
echo "【商品一覧】" . PHP_EOL;
displayProducts($products);

// 商品の追加
/*
【穴埋め問題2】ここに新しい商品を追加するコードを書いてください。
例: 商品ID、名前、価格、在庫数を含めた新商品を定義し、既存の商品リストに追加する。
*/

// 商品一覧を表示(追加後)
echo "【追加後の商品一覧】" . PHP_EOL;
displayProducts($products);

// 商品の検索
/*
【穴埋め問題3】ここに検索キーワードを指定し、検索処理を実行するコードを書いてください。
例: 「みかん」を検索して、その結果を表示する。検索結果がない場合はエラーメッセージを表示する。
*/

以上がこの問題の穴埋めコードです。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

<?php
// 多次元配列を使用した商品データの管理例

// 商品データを多次元配列で定義
$products = [
    ["ID" => 101, "名前" => "りんご", "価格" => 150, "在庫数" => 20],
    ["ID" => 102, "名前" => "みかん", "価格" => 100, "在庫数" => 35],
    ["ID" => 103, "名前" => "バナナ", "価格" => 200, "在庫数" => 15],
];

// 商品一覧を表示する関数
function displayProducts($products) {
    // 配列の内容を1行ずつ出力
    foreach ($products as $product) {
        echo "商品ID: " . $product["ID"] . PHP_EOL;
        echo "名前: " . $product["名前"] . PHP_EOL;
        echo "価格: " . $product["価格"] . "円" . PHP_EOL;
        echo "在庫数: " . $product["在庫数"] . "個" . PHP_EOL;
        echo "-----------------------" . PHP_EOL;
    }
}

// 商品の検索関数
function searchProduct($products, $keyword) {
    // 配列から条件に一致する商品を探す
    foreach ($products as $product) {
        if (strpos($product["名前"], $keyword) !== false) { // 部分一致で検索
            return $product; // 見つかった場合、その商品を返す
        }
    }
    return null; // 見つからなかった場合はnullを返す
}

// 商品一覧を表示
echo "【商品一覧】" . PHP_EOL;
displayProducts($products);

// 商品の追加
$newProduct = ["ID" => 104, "名前" => "ぶどう", "価格" => 300, "在庫数" => 10];
$products[] = $newProduct; // 新商品を追加

echo "【追加後の商品一覧】" . PHP_EOL;
displayProducts($products);

// 商品の検索
$keyword = "みかん";
$result = searchProduct($products, $keyword);

if ($result !== null) {
    echo "検索結果:" . PHP_EOL;
    echo "名前: " . $result["名前"] . PHP_EOL;
    echo "価格: " . $result["価格"] . "円" . PHP_EOL;
    echo "在庫数: " . $result["在庫数"] . "個" . PHP_EOL;
} else {
    echo "商品が見つかりませんでした。" . PHP_EOL;
}

正解コードの解説

このコードのブロック毎の解説を以下に示します。

商品データの定義

$products = [
    ["ID" => 101, "名前" => "りんご", "価格" => 150, "在庫数" => 20],
    ["ID" => 102, "名前" => "みかん", "価格" => 100, "在庫数" => 35],
    ["ID" => 103, "名前" => "バナナ", "価格" => 200, "在庫数" => 15],
];
  • 多次元配列の定義
    配列の中に別の配列を格納することで、データを階層的に管理できます。
    各配列要素は、連想配列(キーと値のペア)として構成されています。
  • 具体例:
    ID名前価格在庫数 というキーを持つ商品情報を管理。
    商品ごとにデータをまとめ、それを一つの大きな配列で管理しています。

商品一覧を表示する関数

function displayProducts($products) {
    foreach ($products as $product) {
        echo "商品ID: " . $product["ID"] . PHP_EOL;
        echo "名前: " . $product["名前"] . PHP_EOL;
        echo "価格: " . $product["価格"] . "円" . PHP_EOL;
        echo "在庫数: " . $product["在庫数"] . "個" . PHP_EOL;
        echo "-----------------------" . PHP_EOL;
    }
}
  • 関数の定義
    商品リストを表示するための関数を作成。
    関数名はdisplayProducts$productsを引数に受け取ります。
  • foreach文の使用
    多次元配列から各要素を順番に取り出し、商品ごとの情報を表示します。
  • 出力形式の工夫
    各商品の情報は行ごとに整列され、見やすくなるよう区切り線を追加しています。

商品の追加機能

$newProduct = ["ID" => 104, "名前" => "ぶどう", "価格" => 300, "在庫数" => 10];
$products[] = $newProduct;
  • 新しい商品の追加
    多次元配列に新しい要素を追加するには、配列の末尾にデータを挿入します。
  • キーと値の組み合わせ
    新商品のデータもキーと値で管理されるため、他の商品と同じ形式を維持します。
  • 動的な追加
    $products[]は、新しい要素を末尾に追加する便利な記述法です。

商品検索機能

function searchProduct($products, $keyword) {
    foreach ($products as $product) {
        if (strpos($product["名前"], $keyword) !== false) { 
            return $product;
        }
    }
    return null;
}
  • 検索機能の定義
    商品名を検索する関数searchProductを作成します。
  • 部分一致の検索
    strpos()関数を使い、商品名に指定されたキーワードが含まれているかを調べます。
  • 検索結果の返却
    該当商品が見つかった場合はその情報を返し、見つからなければnullを返します。
  • 応用ポイント:
    部分一致検索により、名前の一部が入力されただけでも商品が見つかる柔軟な機能を実現しています。

検索結果の表示処理

$keyword = "みかん";
$result = searchProduct($products, $keyword);

if ($result !== null) {
    echo "検索結果:" . PHP_EOL;
    echo "名前: " . $result["名前"] . PHP_EOL;
    echo "価格: " . $result["価格"] . "円" . PHP_EOL;
    echo "在庫数: " . $result["在庫数"] . "個" . PHP_EOL;
} else {
    echo "商品が見つかりませんでした。" . PHP_EOL;
}
  • 検索処理の実行
    商品リストから「みかん」をキーワードに検索します。
  • 結果の条件分岐
    検索結果が存在する場合としない場合で表示内容を変えます。
  • 分岐の活用
    if文を使い、検索結果によって動的にメッセージを変更します。

まとめ

このコードでは「多次元配列」を使ったデータ管理について学びました。

  • 多次元配列の構造
    配列の中に配列を持つことで、複雑なデータを整理して管理できることを理解しました。
  • 関数の活用
    関数を使うことでデータの表示や検索、追加といった機能を分かりやすく整理できることを学びました。
  • 条件分岐とループ
    foreachif文を使ってデータを動的に処理し、実際のプログラムに必要な柔軟性を持たせる手法を身につけました。

このような多次元配列の操作は、データベースやAPIから取得したデータの管理にも役立ちます。

さらに発展的な内容として、配列の並び替えや絞り込み機能の実装にも挑戦してみましょう!

<<前のページ PHP記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    PHPのテキスト&問題集トップへ戻る
    トップページへ戻る