「Undefined array key」とは何か
「Undefined array key」は、配列に定義されていないキーを読み取ったときに表示される警告です。PHPの公式マニュアルでは、未定義の配列キーへのアクセスは、PHP 8.0.0以降ではE_WARNING、PHP 8.0.0より前ではE_NOTICEが発生し、結果はnullになると説明されています。実際の表示は、PHPのバージョンやエラー報告設定によって異なる場合があります。
まずはエラーメッセージに含まれるファイル名、行番号、キー名を確認します。次に、その行で参照しているキーが、直前までの処理で本当に配列へ格納されているかを調べます。よくある原因は、キー名のスペル違い、大文字・小文字の違い、入力値の欠落、配列の初期化漏れです。
発生しやすいコード例と原因の切り分け方
たとえば、次のコードでは、$user配列にnameキーがないため、直接参照した箇所で警告が発生する可能性があります。
<?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 |
<?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
$input = [];
$name = $input['name'] ?? '未設定';
$age = $input['age'] ?? 0;
printf("name=%s, age=%dn", $name, $age);
// 期待される出力例:
// name=未設定, age=0配列を作る段階で必要なキーを初期化する方法もあります。デフォルト値は、文字列なら空文字や「未設定」、数値なら0、真偽値ならfalseなど、後続処理の意味に合わせて選びます。ただし、必須データが欠けている場合までデフォルト値で処理すると、入力ミスやデータ不整合を見逃すことがあります。
入力データの検証と再発防止のポイント
その場で警告を消すだけでなく、キーがなぜ存在しなかったのかを確認することが重要です。外部入力を扱う処理では、必須項目・任意項目・型・許容値を整理し、配列へ格納する前後で検証します。
- エラー行から、キーを生成・取得・受け渡しする処理まで追跡する。
- 配列のキー名を定数や型情報、データ構造の定義で明確にする。
- 任意項目にはデフォルト値を使い、必須項目の欠落は入力エラーとして扱う。
- 開発環境では警告を確認しやすくし、本番環境でのエラー表示は運用方針に合わせる。
- PHPのバージョンとエラー報告設定を確認して、実際の表示内容を判断する。