【PHP】第2回:配列・連想配列・foreach(実務で一番使うPHPの基礎)|Dockerで学ぶ PHP→Laravel 実務入門

   青いPHPエレファント

この記事のゴール

第2回では、次回以降(フォーム処理・DB)で必須になる

  • 配列
  • 連想配列
  • foreach
  • isset / empty
  • 「よくあるバグの原因」

を、実務で使う形で整理します。

1. まずは「配列」が分かればPHPは一気に楽になる

PHPの実務では、ほぼ毎日配列を触ります。

  • DBから取得した結果
  • フォームから送信された値
  • APIレスポンス
  • 設定値
  • 一覧画面に出すデータ

すべて、最終的に「配列」として扱う形になってきますので、ここを押さえていきましょう。

2. 配列(インデックス配列)

src/index.php を以下に置き換えてください。

<?php

$tasks = ["掃除", "買い物", "筋トレ"];

echo $tasks[0];

配列の要点

  • [] で作れる
  • インデックスは0から始まる
  • echo $tasks; はできない(配列まるごとを文字列として扱えない※)

※方法はありますが、今回の連載では扱いません。

3. foreach

この「foreach」がとにかく実務で使います。
PHPでは配列の扱いは必須、そしてforeachは配列を扱う上で必須と言えます。

<?php

$tasks = ["掃除", "買い物", "筋トレ"];

foreach ($tasks as $task) {
  echo $task . "<br>";
}

上に書いているのはforeachの基本となる構文です。
foreachでは、配列の初めの要素から終わりの要素までループ処理を行います。
各ループ処理において現在の要素の値がasの後に指定している変数($task)に代入されます。

ここがポイント

  • foreach は「配列を1件ずつ処理する」

4. 連想配列(実務で一番よく見る形)

次に、連想配列です。
PHPでは、配列のインデックスが0から順番に割り当てられますが、
任意にキーを指定する事が可能です。
「キー」と「値」のペアとして作る配列が連想配列です。

<?php

$task = [
  "title" => "筋トレ",
  "due_date" => "2026-02-20",
  "status" => "open",
];

echo $task["title"];

連想配列が重要な理由

LaravelでもDBでも、最終的にこういう形になります。

  • $task[“title”]
  • $task[“status”]

5. 配列の中に連想配列(DB結果の典型形)

実務で最もよく見るのがこれです。

<?php

$tasks = [
  ["id" => 1, "title" => "掃除", "status" => "open",],
  ["id" => 2, "title" => "買い物", "status" => "done",],
  ["id" => 3, "title" => "筋トレ", "status" => "open",],
];

foreach ($tasks as $task) {
  echo $task["id"] . " : " . $task["title"] . " (" . $task["status"] . ")<br>";
}

ここまで理解できれば、DBの結果も怖くなくなる

PDOで取得する結果は、まさにこの形です。

LaravelのEloquentでも、考え方は同じです。

6. 「タスク管理アプリ」を意識してHTMLを整える

第1回では echo だけでしたが、実務ではHTMLを返します。

src/index.php を次のようにします。

<?php

$tasks = [
  ["id" => 1, "title" => "掃除", "status" => "open",],
  ["id" => 2, "title" => "買い物", "status" => "done",],
  ["id" => 3, "title" => "筋トレ", "status" => "open", ],
];

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>タスク一覧</title>
</head>
<body>

<h1>タスク一覧</h1>
<ul>
  <?php foreach ($tasks as $task): ?>
    <li>
      #<?= $task["id"] ?>
      <?= htmlspecialchars($task["title"], ENT_QUOTES, "UTF-8") ?>
      (<?= $task["status"] ?>)
    </li>
  <?php endforeach; ?>
</ul>

</body>
</html>

ここで覚えておきたいこと

PHPは「HTMLの中に埋め込む」言語

  • <?php ... ?> をHTMLに混ぜるのが基本
  • <?= ... ?> は echo の短縮
  • <?= $task["id"] ?><?php echo $task["id"]; ?> と同じ

7. htmlspecialchars は最初から癖にする

ここは、少しは経験のある開発者向けにあえて最初から入れます。

htmlspecialchars($task["title"], ENT_QUOTES, "UTF-8")

なぜ必要?

今回、”title”という項目にhtmlspecialchars関数を使用していますが、
ユーザーが自由に入力可能な項目だとして、例えば次のような内容を入力された場合

<script>alert(1)</script>

このような文字列を入力してしまうと、ブラウザ上でスクリプトとして実行されてしまいます。
つまり XSS(クロスサイトスクリプティング) の原因になります。

htmlspecialcharsは、HTMLのエスケープ(無害化)処理関数です。

HTMLのタグとして誤認識される特殊文字を、安全な文字列に変換してくれます。
例えば「<」や「>」などの記号は、ブラウザがHTMLタグと判断してしまいますが、
この関数を通すことで、ブラウザに文字としてそのまま表示させる形に変換します。

8. isset と empty

次回のフォーム処理で必ず出てきますので、先に解説しておきます。

8-1. isset(存在しているか)

<?php

$data = ["title" => "筋トレ"];

if (isset($data["title"])) {
echo "title は存在します";
}

8-2. empty(空っぽか)

<?php

$data = ["title" => ""];

if (empty($data["title"])) {
echo "title は空です";
}

使い分け

  • isset:キーが存在するか
  • empty:値が空か(空文字、0、null、未定義など)

9. よくあるバグ

 

9-1. 未定義キーアクセス

echo $task["due_date"];

もし due_date というキーが存在しなければ、警告が出ます。

対策

$dueDate = $task["due_date"] ?? "";

?? の前に指定した項目が存在すればその項目、存在しなければ後ろの項目を返却します。

9-2. foreachの中で変数名を潰す


foreach ($tasks as $tasks) { 
}

上の例は、$tasksの要素を取り出して、$tasks自身に設定しようとしています。
こういう事故はたまに見かけますが、意外に気付きにくいものです。

10. 次回予告(第3回)

第3回では、PHPを「実務っぽく」していきます。

  • function(関数)
  • 引数と戻り値
  • ファイル分割(include/require)
  • 「タスク一覧表示」を部品化する

Laravelに進んだ時に

  • Controller
  • View
  • Model

の理解が一気に楽になります。

まとめ

第2回では、

配列・連想配列・配列の中の連想配列

  • foreach
  • htmlspecialchars
  • isset / empty

を整理しました。

ここまで理解できれば、次回のフォーム処理・DB処理の準備は万全です。