この記事のゴール
第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処理の準備は万全です。