PHP 入門

PHP 配列

PHP において、配列(Arrays)は複数の値を同時に保持できる特殊な変数です。一連の関連データを単一の変数名の下に格納・整理できるため、個々のデータ項目に対して個別に変数を宣言するよりもはるかに効率的な管理が可能になります。

本章では、PHP における主要な3つの配列タイプ、すなわちインデックス配列(Indexed Arrays)連想配列(Associative Arrays)、そして多次元配列(Multidimensional Arrays)について詳しく解説します。

1. インデックス配列 (Indexed Arrays)

インデックス配列(数値配列とも呼ばれます)は、要素を格納するために数値インデックスを使用します。デフォルトではインデックスは 0 から始まります。各要素には整数キー(Key)が自動的に割り当てられ、要素の位置を指定することでその値にアクセスできます。

1.1 インデックス配列の宣言

PHP では、array() コンストラクタ、またはより簡潔なスクエアブラケット [] 構文を使用してインデックス配列を作成できます。

<?php
// array() コンストラクタを使用する場合
$fruits_array_constructor = array("リンゴ", "バナナ", "チェリー");

// 短縮構文の [] を使用する場合(モダンな PHP 開発ではこちらを強く推奨)
$fruits_shorthand = ["リンゴ", "バナナ", "チェリー"];

echo $fruits_shorthand[0]; // 出力:リンゴ
echo $fruits_shorthand[1]; // 出力:バナナ
echo $fruits_shorthand[2]; // 出力:チェリー
?>

まず空の配列を作成し、後から要素を追加することも可能です。要素を追加する際にキー(インデックス)を指定しない場合、PHP は次に対応可能な最小の整数インデックスを自動的に割り当てます。

<?php
$cars = []; // 空のインデックス配列を宣言

$cars[] = "ボルボ";  // インデックス 0 が自動割り当て
$cars[] = "BMW";     // インデックス 1 が自動割り当て
$cars[] = "トヨタ";  // インデックス 2 が自動割り当て

echo $cars[0]; // 出力:ボルボ
echo $cars[1]; // 出力:BMW
?>

数値キーが連続していない場合でも、特定の数値キーを明示的に定義できます。

<?php
$numbers = [];
$numbers[0] = 10;
$numbers[2] = 20; // インデックス 1 をスキップ
$numbers[3] = 30;

echo $numbers[0]; // 出力:10
echo $numbers[2]; // 出力:20
// echo $numbers[1]; // 存在しないインデックスにアクセスすると "Undefined array key" 警告が発生します
?>

1.2 インデックス配列内の要素へのアクセスと修正

インデックス配列の要素にアクセスするには、スクエアブラケットの中に対象要素の数値インデックスを入力します。

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

// 要素へのアクセス
echo "最初の色は:" . $colors[0] . "\n"; // 出力:最初の色は:赤

// 要素の修正
$colors[1] = "黄"; // "緑" を "黄" に変更
echo "現在の2番目の色は:" . $colors[1] . "\n"; // 出力:現在の2番目の色は:黄

// 配列の末尾に新しい要素を追加
$colors[] = "紫";
echo "新しく追加された最後の色は:" . $colors[3] . "\n"; // 出力:新しく追加された最後の色は:紫
?>

1.3 配列の要素数をカウントする

組み込み関数の count() を使用して、配列内の全要素数を取得できます。

<?php
$items = ["テーブル", "椅子", "モニター"];
echo "アイテムの数量:" . count($items) . "\n"; // 出力:アイテムの数量:3
?>

2. 連想配列

連想配列は、PHP において極めて基礎的かつ重要なデータ構造です。この配列では、各要素に数値インデックスではなく、開発者が名前を付けたキー(Key)が割り当てられます。これらのキーは通常ストリング(文字列)であり、対応する値に対してより記述的で理解しやすいアクセス手段を提供します。

2.1 連想配列の宣言

「キー・バリュー・ペア (key-value pairs)」を指定して連想配列を定義します。キーと値の間は => 記号(ダブルアロー)で区切ります。

<?php
// array() コンストラクタを使用する場合
$student_array_constructor = array(
    "name" => "アリス",
    "age" => 22,
    "major" => "コンピュータサイエンス"
);

// 短縮構文の [] を使用する場合(推奨)
$student_shorthand = [
    "name" => "ボブ",
    "age" => 24,
    "major" => "電子工学"
];

echo $student_shorthand["name"]; // 出力:ボブ
echo $student_shorthand["age"];  // 出力:24
?>

インデックス配列と同様に、空の連想配列に対して一対ずつキー・バリュー・ペアを追加したり、既存の値を更新したりできます。

<?php
$person = []; // 空の連想配列

$person["firstName"] = "ジェーン";
$person["lastName"] = "ドゥ";
$person["city"] = "ニューヨーク";

echo $person["firstName"]; // 出力:ジェーン

// 既存の要素を修正
$person["city"] = "ロサンゼルス";
echo $person["city"]; // 出力:ロサンゼルス
?>

2.2 実践ケース:ユーザープロフィール

ユーザーのプロフィール情報を保存する場合、連想配列は理想的な選択肢です。ユーザー名、メールアドレス、登録ステータスなどの各情報を、明確で記述的なキーで識別できるからです。

<?php
$userProfile = [
    "username" => "john_doe",
    "email" => "[email protected]",
    "status" => "active",
    "lastLogin" => "2023-10-26 10:30:00"
];

echo "ようこそ、" . $userProfile["username"] . "さん!\n";
echo "あなたのメールアドレスは:" . $userProfile["email"] . "\n";
echo "アカウントステータスは:" . $userProfile["status"] . " です。\n";

// ユーザーの最終ログイン日時を更新
$userProfile["lastLogin"] = date("Y-m-d H:i:s"); // 現在のサーバー時刻に更新
echo "最終ログイン日時:" . $userProfile["lastLogin"] . "\n";
?>

3. 多次元配列

多次元配列とは、本質的には「1つ以上の配列を要素として持つ配列」のことです。この構造により、Excel のスプレッドシートのような、構造化されたテーブル形式で複雑なデータを保存できます。最も一般的なのは2次元配列(配列の中の配列)ですが、PHP は3次元以上の多次元配列もサポートしています。

3.1 多次元配列の宣言

2次元配列は「行」と「列」としてイメージすると分かりやすいでしょう。外側の配列の各要素自体が、独立した配列(1つの「行」データを表す)になっています。

<?php
// 行列を表す 2D インデックス配列
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 学生リストを表す 2D 連想配列
$students = [
    [
        "name" => "アリス",
        "age" => 22,
        "major" => "CS"
    ],
    [
        "name" => "ボブ",
        "age" => 24,
        "major" => "EE"
    ],
    [
        "name" => "チャーリー",
        "age" => 23,
        "major" => "Math"
    ]
];
?>

3.2 多次元配列内の要素へのアクセス

多次元配列の要素にアクセスするには、連続する複数のスクエアブラケットを使用します。次元の数だけブラケットが必要になり、それらは配列のネスト構造に対応しています。

<?php
// ... 上記で定義した $matrix と $students 配列を使用 ...

// 行列(インデックス多次元配列)の要素にアクセス
echo $matrix[0][0]; // 出力:1 (1行目、1列目)
echo $matrix[1][2]; // 出力:6 (2行目、3列目)
echo $matrix[2][1]; // 出力:8 (3行目、2列目)

// 学生リスト(連想多次元配列)の要素にアクセス
echo $students[0]["name"];  // 出力:アリス (最初の学生の氏名)
echo $students[1]["major"]; // 出力:EE (2番目の学生の専攻)

// ネストされた配列内の要素を修正
$students[0]["age"] = 23; // アリスの年齢を 23 に変更
echo $students[0]["age"]; // 出力:23
?>

3.3 実践ケース:商品カタログ

多次元配列は、商品カタログの管理に非常に適しています。各カテゴリーの下に複数の商品が含まれ、さらに各商品が複数のプロパティ(名前、価格、在庫など)を持っている状況を完璧に表現できます。

<?php
$productCatalog = [
    "electronics" => [ // 電子機器カテゴリ (連想配列の中にインデックス配列、さらにその中に連想配列)
        [
            "id" => "E001",
            "name" => "スマートフォン",
            "price" => 699.99,
            "stock" => 150
        ],
        [
            "id" => "E002",
            "name" => "ノートパソコン",
            "price" => 1299.00,
            "stock" => 75
        ]
    ],
    "books" => [ // 書籍カテゴリ
        [
            "id" => "B001",
            "name" => "PHP 基礎チュートリアル",
            "price" => 29.99,
            "stock" => 200
        ],
        [
            "id" => "B002",
            "name" => "アルゴリズム詳解",
            "price" => 59.99,
            "stock" => 80
        ]
    ]
];

// 特定の商品情報にアクセス
echo "最初の電子機器の商品名:" . $productCatalog["electronics"][0]["name"] . "\n"; // 出力:スマートフォン
echo "『アルゴリズム詳解』の価格:$" . $productCatalog["books"][1]["price"] . "\n"; // 出力:$59.99

// スマートフォンが1台売れたと仮定して在庫を更新
$productCatalog["electronics"][0]["stock"] -= 1;

echo "更新後のスマートフォン在庫:" . $productCatalog["electronics"][0]["stock"] . "\n"; // 出力:149
?>

この例では、混合型の多次元配列を示しています。トップレベルのキー("electronics", "books")は連想配列のカテゴリ名であり、その値はインデックス配列です。そしてそのインデックス配列の内部では、具体的な各商品情報がさらに連想配列によって構成されています。