schedule2020-01-17

PHP Notice:Undefined indexの対処

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'] ?? '';

PHP7 新機能 - Manual - PHP

余談: !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 isset, empty, is_null の違い早見表 - Qiitaより