laravel 未定義の配列キー undefined array key って何?
んまー、このエラーはよーく出てくる。しかも調べてもあまりピンとくる解決法がない…
このエラーは結局配列の中身が入ってないっていうことである。例えば
$配列 = [ 'a', 'null ' , 'c',]
添え字キー 0 1 2
このような配列があるとする。
で、二番目(添え字キーでいうと1番目)を取ろうとすると
「そのキーでは中身ないですよ、設定されてないですよ、キー1=NULLですよ」
といってエラーになるわけである。
NULLならNULLで出せばいいじゃない、と思うが、駄目なのである。
自分もこのエラーには大概悩まされた。だってエラーの内容が表示されないんだもの。
ファサードだか何だかよくわからない部分しか表示しないから一体何のエラーだかわかりずらい事この上ない!!!。
しかし、この「未定義の配列キー」エラーは、ただの配列NULLエラーなのだ。
配列にしっかり値を入れようよっっっていうコンピューターのただただ優しい指摘なのである。
解決方法。ありますよ。自分がいくつか成功している解決方法をここに書こうと思う。
① @if分でNULLをはじくとエラーにならない。
② @foreach で as を完全無視。 $loop で繰り返してエラーを回避しやすくする。
③ 配列をしっかり入れるように見直しする
④ pluckをつかってレコードとキーを作り、キーから引き出す。
こんなところでしょうかね。簡単に説明しましょう
1⃣ @if分でNULLをはじくとエラーにならない
これは結構強力。
@if (empty($配列[キー]))
値はありません
@else
値はあります
@endif
のように@ifでNULLをはじくとエラーは回避できる。しかしこれでもキー自体がなかったりするとエラーになることもある。
$配列 = [ a , b , c ,]
添え字 0 1 2
という配列なのに、キー3で値を取ろうとすることはできないので注意。
そんなキーはありませんよっていうエラーになる。
2⃣ @foreach で as を完全無視。 $loop で繰り返してエラーを回避しやすくする。
これはちょっと恥ずかしい方法なのですが、
@foreach ($配列 as name)
で、name を使いつつ他の配列を同時にループさせるときに、ループ数が合わなかったりすることがあるので、自分はas nameは使わないようにしてます。
まあ単なる素人発言です。しかし、このエラーがまあよく起こる。
@foreach ($配列 as name)
{{$配列[$loop -> index]}}
{{$配列2[$loop -> index]}}
{{$配列3[$loop -> index]}}
@endforeach
のように、自分は$loopを使ってループさせています。これだと配列のループ数が合わないことがない利点があります。エラーを減らす方法になるかと。
3⃣ 配列をしっかり入れるように見直しする
当たり前です。これが一番の解決策です。
未定義キーのエラーはただの配列ミスなので、しっかりデーターベースを調べて、NULL値とキーを把握しましょう。
とはいえこれがホントによく起こる。
例えばデーターベースのレコードを->deleteする命令をしたりすると、それに関連してた所が次の日にエラーになっていたりするのだ。
「昨日までは従順だったのに!!さてはコンピューターの反乱がついに起きたか!!」
ということはよーくあるのでDBの見直しをしよう。
4⃣ pluckをつかってレコードとキーを作り、キーから引き出す
これは1⃣のもう一つの解決法で、最初っからNULLを配列に入れないようにする方法である。
pluckで最初っから全てデーターベースの値をキー設定していまえばいいということになる。
->pluck('値’,'id')
という風にして、最初っから全データーベースの値とキーを作っておくのです。
すると、
$配列 = [ id1=>値1 , id2=> 値2 , id3=> 値3 ………]
このように、全値と全キーが出来上がります。
この方法ならNULLになる心配がない。
そしてidキーを使って@foreachすればいいだけなのであります。
@foreach ($配列 as name)
$配列[$idの配列[$loop->index]]
@endforeach
こんな感じ?
NULLの入った配列を最初っから作らない。pluckでデーターベース全部を配列にしてしまって、必要な値をキーで取り出す、という方法になる。
結論
未定義の配列エラーは最初はほんと意味が解りませんでした。だってエラー内容が全く表示されないのですから。
しかし、これは単なる配列NULLエラーだと気が付くと、結構解決はできる。
しかもemputyとpluckでほぼ解決できる。
後はタイプエラーだからしっかりミスを調べること!!!以上