Notice: Undefined index
は定義されていない配列の要素を使用した場合に発生します。
<?php
$array = [];
echo $array['name']; // Notice: Undefined index: name
うっかりミスか確かめる
フォームリクエストやモデルの処理でよく見かけます。
Notice: Undefined index
が起きる主な要因はフォームの変数やカラム名の間違いです。
うっかりミスか確かめておきたい。
ログに出力して配列に要素があるか確かめる。
ブラウザでデバックしているならvar_dump()
を使うと良いです。
$array['name'] = 'hoge';
var_dump($array);
/*
array(1) {
["name"]=>
string(4) "hoge"
}
*/
ブラウザで出力すると1行になるため配列が長いと見づらいです。
<pre>
タグで囲むと改行してくれて見やすくなる。
echo '<pre>';
var_dump($array);
echo '</pre>';
要素を初期化する
if分岐の中で宣言していた場合、状態が変わった時にNotice: Undefined index
が起きてしまいます。
if($array['id'] == 12){
$array['name'] = 'hoge';
}
$result = someFunction($array['name']); // Notice undefined index
分岐の前に初期化しておくとコードの変更にも強くなります。
未定義でも処理を進めたい場合
先に配列の要素が存在するかを確認し、存在しない場合の処理を記述します。
if ( !isset($array['name']) || $array['name'] == "" ){
$message = '名前を入力してください';
} //Notice undefined indexは出ない
単純に、未定義な要素の代わりに値を置きたい場合は次のようにします。
三項演算子
未定義またはNULLのとき空文字を返す。
$name = isset($array['name']) ? $array['name'] : '';
Null 合体演算子
PHP 7.0からNull 合体演算子が使えるようになっています。 三項演算子よりもスッキリと書くことができます。
$name = $array['name'] ?? '';
余談: !isset() == is_null()
isset()
は変数が存在しないときと、NULLの場合にtrueを返します。
これはis_null()
の逆だと思い!
が減って分かり易いなと、以下のコードを書いたらエラーになった。
if ( is_null($array['name']) ){
$message = '名前を入力してください';
} //Notice undefined indexが出る
未定義の変数の場合にis_null()
はtrueが返るが、未定義の配列の要素の場合には引数に渡す際にエラー判定があるようです。
issetの定義
変数がセットされているかを調べます。 これは変数が宣言されており、NULLとは異なる値だということです。
isset - PHP
isset, empty, is_null の違い早見表
値 | if($var) | isset | empty | is_null |
---|---|---|---|---|
$var=1 | true | true | false | false |
$var=""; | false | true | true | false |
$var="0"; | false | true | true | false |
$var=0; | false | true | true | false |
$var=NULL; | false | false | true | true |
$var | false | false | true | true |
$var=array() | false | true | true | false |
$var=array(1) | true | true | false | false |
PHP Warning Illegal string offset 'foo'
PHPschedule2020-02-03
PHP Notice:Undefined indexの対処
PHPschedule2020-01-17
PHP compact関数で宣言していない変数の扱い
PHPschedule2020-01-15