PHP

PHPで「Undefined array key」が出る原因と直し方|よくあるエラーを実例で解説

PHPで配列に存在しないキーを参照したときに発生する「Undefined array key」の原因を整理し、確認方法や安全な修正方法を実例ベースで解説する構成です。

この記事でわかること

  • エラーは、配列に存在しないキーを読み取っている箇所を特定することから解決する。
  • キーの存在確認、初期値の設定、入力値の検証など、状況に応じて修正方法を選ぶ。
  • エラーを隠すのではなく、なぜキーが存在しないのかというデータの流れを確認する。

「Undefined array key」とは何か

「Undefined array key」は、配列に定義されていないキーを読み取ったときに表示される警告です。PHPの公式マニュアルでは、未定義の配列キーへのアクセスは、PHP 8.0.0以降ではE_WARNING、PHP 8.0.0より前ではE_NOTICEが発生し、結果はnullになると説明されています。実際の表示は、PHPのバージョンやエラー報告設定によって異なる場合があります。

まずはエラーメッセージに含まれるファイル名、行番号、キー名を確認します。次に、その行で参照しているキーが、直前までの処理で本当に配列へ格納されているかを調べます。よくある原因は、キー名のスペル違い、大文字・小文字の違い、入力値の欠落、配列の初期化漏れです。

発生しやすいコード例と原因の切り分け方

たとえば、次のコードでは、$user配列にnameキーがないため、直接参照した箇所で警告が発生する可能性があります。

PHP
<?php
$user = [
    'email' => 'user@example.com',
];

echo $user['name'];

// 期待される挙動:
// nameキーが存在しないため、環境に応じて
// "Undefined array key "name"" などの警告が表示される可能性があります。

切り分けるときは、次の順に確認すると整理しやすくなります。フォームやURLパラメータ、データベースの取得結果など、外部から受け取る配列は、必要なキーが常に存在するとは限りません。

  • 参照しているキー名のスペルと大文字・小文字を確認する。
  • 配列の階層を確認する。例: $data['user']['name'] の各階層が存在するか。
  • キーを追加する処理が、参照処理より先に実行されているか確認する。
  • 外部入力や取得結果に、必須キーが含まれる仕様か確認する。

キーの存在を確認してから参照する方法

キーがない可能性のある配列は、参照前に存在を確認します。issetはキーが存在し、値がnullではない場合にtrueになります。一方、array_key_existsは、値がnullでもキー自体が存在すればtrueになります。

確認したいこと使う方法nullの場合
値を利用できる状態かisset($data['key'])false
キー自体が存在するかarray_key_exists('key', $data)true
issetとarray_key_existsの使い分け
PHP
<?php
$data = [
    'name' => null,
];

if (isset($data['name'])) {
    echo $data['name'];
} else {
    echo 'nameは利用できません';
}

if (array_key_exists('name', $data)) {
    echo 'nameキーは存在します';
}

// 期待される出力例:
// nameは利用できません
// nameキーは存在します

nullを「未入力」や「値なし」として扱うならissetが向いています。nullも有効な値として、キーの存在そのものを確認したい場合はarray_key_existsを使います。なお、array_key_existsが確認するのは配列の第1階層です。

初期値やデフォルト値を設定して直す方法

キーがない場合も処理を継続したい表示用データや任意項目では、null合体演算子(??)でデフォルト値を指定できます。左辺のキーが存在しない場合や値がnullの場合に、右辺の値が使われます。

PHP
<?php
$input = [];

$name = $input['name'] ?? '未設定';
$age = $input['age'] ?? 0;

printf("name=%s, age=%dn", $name, $age);

// 期待される出力例:
// name=未設定, age=0

配列を作る段階で必要なキーを初期化する方法もあります。デフォルト値は、文字列なら空文字や「未設定」、数値なら0、真偽値ならfalseなど、後続処理の意味に合わせて選びます。ただし、必須データが欠けている場合までデフォルト値で処理すると、入力ミスやデータ不整合を見逃すことがあります。

入力データの検証と再発防止のポイント

その場で警告を消すだけでなく、キーがなぜ存在しなかったのかを確認することが重要です。外部入力を扱う処理では、必須項目・任意項目・型・許容値を整理し、配列へ格納する前後で検証します。

  • エラー行から、キーを生成・取得・受け渡しする処理まで追跡する。
  • 配列のキー名を定数や型情報、データ構造の定義で明確にする。
  • 任意項目にはデフォルト値を使い、必須項目の欠落は入力エラーとして扱う。
  • 開発環境では警告を確認しやすくし、本番環境でのエラー表示は運用方針に合わせる。
  • PHPのバージョンとエラー報告設定を確認して、実際の表示内容を判断する。

参考