質問: Uninitialized string offset: 6 エラーの原因が分かりません。 下記は、calender.blade.phpです ``` @foreach (['日', '月', '火', '水', '木', '金', '土'] as $dayOfWeek) @if($loop->first) {{$dayOfWeek[0]}} @elseif($loop->last) {{$dayOfWeek[6]}} @else {{$dayOfWeek}} @endif @endforeach ``` calender.blade.phpの下記の部分を外しますと正常に動作するのですが、下記の行を加えますと、「Uninitialized string offset: 6」エラーが発生してしまいます。 ``` @elseif($loop->last) {{$dayOfWeek[6]}} ``` 配列の中にはインデックス「6」に値が入っているのにも関わらず、何故このようなエラーが発生してしまうのか分かりません。 エラー解決の為、ご助言頂けましたら、幸いです。 追記です。 データが入っていると記載したのは、「['日', '月', '火', '水', '木', '金', '土'] 」ここでデータを直接埋め込んでいたため、そのように思いました。
回答: PHPマニュアルのforeachを見れば指定した配列に関して、現在の要素が`$value`に入るようです。 あまり大真面目に調べておらず恐縮ですが、PHPでは文字列は文字の配列として取得できるそうなので、添え字をつけて要素にアクセスするという構文自体は間違っていないと思います。 ※**コードが正しいと言っている訳ではありません**ので、後述する「デバッグ」をしてよく確認をしてください 今回のtoll_treeさんが書いたコードのケースではエラーが出て然りです。 分からない場合は実際にコードを実行して、エラーの原因を究明してください。 バグが起きたときは何が原因なのか該当のコードを見つけて、どのように直したら正常に動作するのか、虱潰しで見つけて直していきます。探偵になった気分です。 本題ですが、具体的に何をすればいいのかお困りでしょう。 それは`デバッグ`です。 ### デバッグとは? 端的に言うと「バグを取り除く作業」のことです。 PHPにおけるデバッグ方法を少し調べてみました。 一番安易な方法は`var_damp()`や`echo`を使うことですが、個人的には`ステップ実行`ができるツールの使用をお勧めします。 「ツールの使い方を覚えなきゃいけないなんて、かえって大変なんじゃないの? 」とお考えになるかもしれませんが、それは違います。 確実にそのコストの何倍も何十倍...否、**何桁倍もメリットを享受できます。** ### ステップ実行とは? ステップ実行と言うのは、 * 「ブレークポイント」を使うことでプログラムを一時停止することができる * 一時停止中は、変数やフィールドの中身を見ることができる * ステップオーバー、ステップイン、ステップアウトなどを使って段階的にコードを実行できる という代物です。 ### なぜデバッグを覚えるべきか? **エラーを知るためにはプログラムの動きを理解する必要があります。** ここでのポイントは**人から直接エラーを知ることはできない**ということです。 あくまでそれは考えるきっかけを与えているだけで、それを元にバグ修正しているに過ぎないだけです。 結局、修正するにしてもプログラムの動きを理解していないと意味がありません。 そして、プログラムの動きを理解してやっとエラーを解決するための下準備が出来る訳です。 くどい言い回しですみません。 とにかく、ヒューマンエラーは完全に防げません。 今ここに書いてる自分の内容だって主観や嘘が混じっているかもしれないです。 ただし、**プログラムは嘘をつきません。**書いたコードの通りに動きます。 なので、まずはプログラムの動きを理解する必要があります。 その1つの手段としてデバッグが存在しますから、toll_treeさんには是非この機に覚えて欲しいということです。 ### デバッガの導入について 基本的には`IDE`(統合開発環境)を使う必要があるようです。 `NetBeans`や`PHPStorm`で少し調べてみてください。 他にもたくさんあると思いますが、ボランティアとしてはここまでです。 他にデバッグできる手段があるかどうかは、是非調べてみてください。 プログラムの動きが理解できないときに「怖い」「動きが気になる」と考え、そしてそれを解決するために「デバッグをしなくては」と思えてきたら良い傾向です。 今回のようにデバッグで解決するような質問は無くなり、コーディングによるバグが減り、自己解決ができるようになるのですから。