MENU

【PHP】配列の基本と使い方を解説|Webの基礎

PHPの配列の基本と使い方を解説|Webの基礎
目次

はじめに

前回の記事では、for文・while文による繰り返し処理について解説しました。

今回は、複数の値を1つの変数にまとめて扱える配列について解説します。配列は、商品の一覧・会員のリスト・フォームの入力値など、PHPで扱うデータのほとんどで使われる重要な仕組みです。

配列とは?

配列とは、複数の値を、順番を付けて1つの変数にまとめて入れておく入れ物です。

たとえば、3つの果物の名前を扱う場合、配列を使わないと変数を3つ用意することになります。

<?php
    $fruit1 = "りんご";
    $fruit2 = "みかん";
    $fruit3 = "ぶどう";

果物が100種類になったら、変数も100個必要です。配列を使えば、1つの変数にまとめられます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

配列に入っているそれぞれの値を要素、要素に付いている番号をインデックスと呼びます。

配列$fruitsを3つの箱が並んだ入れ物として表した図。それぞれの箱にりんご・みかん・ぶどうが入り、箱の下にインデックス0・1・2が付いている

VBAの配列と役割は同じですが、PHPの配列はDimやReDimで大きさを決める必要がなく、要素を追加すると自動で大きくなります。また、1つの配列の中に文字列と数値など、違う型の値を混ぜて入れることもできます。

配列の作り方

配列は、[ ](角括弧)の中に値をカンマで区切って並べて作ります。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"]; // 文字列の配列
    $scores = [80, 65, 92];                  // 数値の配列
    $empty  = [];                            // 空の配列

[]の代わりにarray()と書く方法もあります。古いPHPのコードやWordPressのテーマなどで見かけることがありますが、意味は同じです。

<?php
    $fruits = array("りんご", "みかん", "ぶどう"); // [ ] と同じ意味

これから新しく書くコードでは、短く書ける[ ]を使うのがおすすめです。

要素の取り出し・変更・追加

インデックスで要素を取り出す

配列の要素は、変数名[インデックス]の形で取り出します。インデックスは0から始まる点に注意してください。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    echo $fruits[0]; // りんご
    echo $fruits[2]; // ぶどう

1番目の要素は$fruits[1]ではなく$fruits[0]です。3つの要素があるとき、インデックスは0・1・2になり、最後のインデックスは「要素数 − 1」になります。

要素の値を変更する

インデックスを指定して代入すると、その要素の値を書き換えられます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    $fruits[1] = "バナナ";

    echo $fruits[1]; // バナナ

末尾に要素を追加する

インデックスを書かずに変数名[] = 値と書くと、配列の末尾に要素を追加できます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    $fruits[] = "もも";

    echo $fruits[3]; // もも

追加された要素には、自動で次のインデックス(ここでは3)が付きます。空の配列[]を用意しておき、後から要素を追加していく使い方もよくあります。

配列の中身を確認する(print_r・var_dump)

配列をechoで表示しようとすると、中身ではなくArrayという文字と警告が表示されます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    echo $fruits;
    // Warning: Array to string conversion
    // Array

配列の中身をまとめて確認したいときは、print_r()を使います。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

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

実行結果は次のとおりです。インデックスと値の組み合わせが一覧で表示されます。

Array
(
    [0] => りんご
    [1] => みかん
    [2] => ぶどう
)

<pre>タグで囲むと、ブラウザでも改行やインデントがそのまま表示されて読みやすくなります。

データ型の記事で紹介したvar_dump()でも配列の中身を確認でき、こちらは値の型も一緒に表示されます。表示される内容が多くなるので、まずはprint_r()で中身を確認し、型まで調べたいときにvar_dump()を使うとよいでしょう。

要素数を数える(count関数)

配列にいくつ要素が入っているかは、count()関数で調べられます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    echo count($fruits); // 3

count()は、次に紹介する「for文で配列を順番に処理する」ときや、「最後の要素を取り出す」ときに使います。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    $last = $fruits[count($fruits) - 1]; // インデックスは「要素数 − 1」
    echo $last; // ぶどう

for文で配列の要素を順番に処理する

前回の記事で解説したfor文とcount()を組み合わせると、配列の要素を先頭から順番に処理できます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    for ($i = 0; $i < count($fruits); $i++) {
        echo ($i + 1) . "番目:" . $fruits[$i] . "<br>";
    }

実行結果は次のとおりです。

1番目:りんご
2番目:みかん
3番目:ぶどう

インデックスは0から始まるため、カウンタ変数$iも0から始め、条件式は$i < count($fruits)(要素数未満)にします。$i <= count($fruits)と書くと、存在しないインデックス3まで取り出そうとして警告が出ます。

配列の要素を順番に処理するときは、インデックスを使わずに書けるforeach文を使うのが一般的です。foreach文は次回の記事で解説します。

連想配列(キーで値を管理する)

ここまでの配列は、要素に0・1・2…という番号が自動で付いていました。PHPでは、番号の代わりに文字列の名前(キー)を付けることもできます。このような配列を連想配列と呼びます。

連想配列は、キー => 値の組み合わせをカンマで区切って並べて作ります。

<?php
    $user = [
        "name"  => "田中",
        "age"   => 30,
        "email" => "tanaka@example.com",
    ];

    echo $user["name"]; // 田中
    echo $user["age"];  // 30

要素を取り出すときは、インデックスの代わりに$user["name"]のようにキーを指定します。「0番目」よりも「name」のほうが何の値か分かりやすいため、1人の会員の情報や1つの商品の情報のように、意味の違う値をまとめるときは連想配列が向いています。

通常の配列と連想配列を比べた図。通常の配列は0・1・2の番号で要素を区別し、連想配列はname・age・emailのキーで要素を区別する

値の変更や追加も、キーを指定して代入します。存在しないキーに代入すると、新しい要素として追加されます。

<?php
    $user = ["name" => "田中", "age" => 30];

    $user["age"]  = 31;          // 変更
    $user["city"] = "東京";      // 追加

    echo "{$user["name"]}さん({$user["age"]}歳・{$user["city"]})";
    // 田中さん(31歳・東京)

変数の記事で解説したダブルクォートの中に変数を埋め込む書き方では、連想配列の要素も{$user["name"]}のように{ }で囲んで埋め込めます。

多次元配列(配列の中に配列を入れる)

配列の要素には、別の配列を入れることもできます。これを多次元配列と呼びます。たとえば、複数の商品の情報をまとめるときは、「商品1つ分の連想配列」を要素に持つ配列を作ります。

<?php
    $products = [
        ["name" => "ノート",     "price" => 150],
        ["name" => "ボールペン", "price" => 120],
        ["name" => "消しゴム",   "price" => 80],
    ];

    echo $products[1]["name"];  // ボールペン
    echo $products[1]["price"]; // 120

$products[1]で2番目の商品(連想配列)を取り出し、さらに["name"]でその商品名を取り出しています。データベースから取得したデータも、多くの場合この形で扱います。

実務サンプル(商品一覧を表で表示する)

多次元配列とfor文を組み合わせて、商品一覧をHTMLの表(<table>)で表示するサンプルです。商品が増えても、配列に1行追加するだけで表に反映されます。

多次元配列の商品データをfor文でHTMLの表に表示した結果の例。商品名・価格・税込価格の3列に、ノート・ボールペン・消しゴムの3行と合計行が並ぶ]
<?php
    // 商品データ(データベースから取得した想定)
    $products = [
        ["name" => "ノート",     "price" => 150],
        ["name" => "ボールペン", "price" => 120],
        ["name" => "消しゴム",   "price" => 80],
    ];

    $taxRate = 0.1; // 消費税率
    $total   = 0;   // 税込価格の合計
?>
<table border="1">
    <tr>
        <th>商品名</th><th>価格</th><th>税込価格</th>
    </tr>
    <?php for ($i = 0; $i < count($products); $i++): ?>
        <?php
            $item     = $products[$i]; // i番目の商品(連想配列)
            $taxPrice = (int)($item["price"] * (1 + $taxRate));
            $total   += $taxPrice;
        ?>
        <tr>
            <td><?php echo $item["name"]; ?></td>
            <td><?php echo $item["price"]; ?>円</td>
            <td><?php echo $taxPrice; ?>円</td>
        </tr>
    <?php endfor; ?>
    <tr>
        <th colspan="2">合計(<?php echo count($products); ?>点)</th>
        <td><?php echo $total; ?>円</td>
    </tr>
</table>

ポイントは次のとおりです。

    • 商品データは「商品1つ分の連想配列」を並べた多次元配列にしています
    • for文の中で$item = $products[$i];と、i番目の商品をいったん変数に入れておくと、$item["name"]のように短く書けます
    • 税込価格は小数になることがあるため、(int)で整数に変換しています(データ型の記事で解説した型変換です)
    • 合計の件数はcount($products)で表示しているため、商品を追加・削除しても自動で変わります

    実行すると、ノート(165円)・ボールペン(132円)・消しゴム(88円)の3行と、合計「385円」の行が表に表示されます。

    よくある質問・エラー対処

    Q. Warning: Undefined array keyという警告が出ます

    → 存在しないインデックスやキーを指定して取り出そうとしています。Undefined array key 3ならインデックス3、Undefined array key "email"ならキー"email"が配列にありません。インデックスが0から始まることや、キーのつづりを確認してください。for文の条件式が<=になっていないかも確認しましょう。


    Q. 配列をechoするとArrayと表示されます

    → echoでは配列の中身を表示できません。中身を確認したいときはprint_r()やvar_dump()を使い、特定の要素を表示したいときは$fruits[0]のようにインデックスやキーを指定してください。


    Q. 連想配列のキーは、クォートで囲まないといけませんか?

    → 文字列のキーは$user["name"]のようにクォートで囲みます。$user[name]のように囲まずに書くと、PHP 8ではエラー(Undefined constant)になります。


    Q. 最後の要素を取り出すにはどうすればいいですか?

    → インデックスは0から始まるため、最後の要素は$fruits[count($fruits) - 1]で取り出せます。配列の操作に便利な関数は、今後の記事でまとめて解説予定です。

    おわりに(まとめ)

    まとめ

    配列を使うと、複数の値を1つの変数にまとめて扱えます。

    • ✅ 配列は [ ] の中に値をカンマで区切って作る
    • ✅ インデックスは0から始まり、最後は「要素数 − 1」
    • ✅ 変数名[] = 値 で末尾に要素を追加できる
    • ✅ 中身の確認は print_r()、要素数は count() で調べる
    • ✅ 連想配列は「キー => 値」で、意味の違う値をまとめるのに向いている
    • ✅ 配列の中に配列を入れた多次元配列で、表のようなデータを扱える

    次回は、配列を繰り返し処理する「foreach文」と、ループを途中で抜ける「break・continue」について解説します。

    次回は、配列の要素を1つずつ取り出すforeach文と、繰り返しを途中で止めたり飛ばしたりするbreak・continueについて解説予定です。

    この記事が、少しでも誰かのお役に立てれば幸いです。

    関連記事

    当サイトの記事で使用したVBAなどのサンプルをDLできます

    この記事のサンプルはありません!

    ダウンロードページへは下のカードをクリックすればジャンプできます。
    よろしければご利用ください!


    【CSS】テキスト関連プロパティについて基本解説|Webの基礎


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