Uninitialized string offset: エラーに関して

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 645

toll_tree

score 31

Uninitialized string offset: 6 エラーの原因が分かりません。

下記は、calender.blade.phpです

<table class="calender_table">
    <thead>
      <tr>
      @foreach (['日', '月', '火', '水', '木', '金', '土'] as $dayOfWeek)
        @if($loop->first)
          <th class="sunday">{{$dayOfWeek[0]}}</th>
        @elseif($loop->last)
          <th class="saturday">{{$dayOfWeek[6]}}</th>
        @else
        <th>{{$dayOfWeek}}</th>
        @endif
      @endforeach
      </tr>
    </thead>

  </table>


calender.blade.phpの下記の部分を外しますと正常に動作するのですが、下記の行を加えますと、「Uninitialized string offset: 6」エラーが発生してしまいます。

@elseif($loop->last)
 <th class="saturday">{{$dayOfWeek[6]}}</th>


配列の中にはインデックス「6」に値が入っているのにも関わらず、何故このようなエラーが発生してしまうのか分かりません。
エラー解決の為、ご助言頂けましたら、幸いです。
追記です。
データが入っていると記載したのは、「['日', '月', '火', '水', '木', '金', '土'] 」ここでデータを直接埋め込んでいたため、そのように思いました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/06/17 18:14 編集

    ちなみにBluOxyさんのプロフィールを確認してもらえればわかりますが、BluOxyさんはPHPでの活動がほとんどない回答者です。その方がこれだけの回答を書いたということ、どういうことか一考してくださいね。そしてその厚意を踏みにじるような行為が決して許されることではないということを。

    キャンセル

  • 退会済みユーザー

    2019/06/18 00:04

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • mikkame

    2019/06/18 13:50

    とりあえず低評価がつかない質問の仕方を覚えて欲しい

    キャンセル

回答 2

checkベストアンサー

+5

PHPマニュアルのforeachを見れば指定した配列に関して、現在の要素が$valueに入るようです。

あまり大真面目に調べておらず恐縮ですが、PHPでは文字列は文字の配列として取得できるそうなので、添え字をつけて要素にアクセスするという構文自体は間違っていないと思います。
コードが正しいと言っている訳ではありませんので、後述する「デバッグ」をしてよく確認をしてください

今回のtoll_treeさんが書いたコードのケースではエラーが出て然りです。
分からない場合は実際にコードを実行して、エラーの原因を究明してください。

バグが起きたときは何が原因なのか該当のコードを見つけて、どのように直したら正常に動作するのか、虱潰しで見つけて直していきます。探偵になった気分です。

本題ですが、具体的に何をすればいいのかお困りでしょう。
それはデバッグです。

デバッグとは?

端的に言うと「バグを取り除く作業」のことです。

PHPにおけるデバッグ方法を少し調べてみました。
一番安易な方法はvar_damp()echoを使うことですが、個人的にはステップ実行ができるツールの使用をお勧めします。

「ツールの使い方を覚えなきゃいけないなんて、かえって大変なんじゃないの? 」とお考えになるかもしれませんが、それは違います。

確実にそのコストの何倍も何十倍…否、何桁倍もメリットを享受できます。

ステップ実行とは?

ステップ実行と言うのは、

  • 「ブレークポイント」を使うことでプログラムを一時停止することができる
  • 一時停止中は、変数やフィールドの中身を見ることができる
  • ステップオーバー、ステップイン、ステップアウトなどを使って段階的にコードを実行できる

という代物です。

なぜデバッグを覚えるべきか?

エラーを知るためにはプログラムの動きを理解する必要があります。

ここでのポイントは人から直接エラーを知ることはできないということです。

あくまでそれは考えるきっかけを与えているだけで、それを元にバグ修正しているに過ぎないだけです。

結局、修正するにしてもプログラムの動きを理解していないと意味がありません。
そして、プログラムの動きを理解してやっとエラーを解決するための下準備が出来る訳です。

くどい言い回しですみません。

とにかく、ヒューマンエラーは完全に防げません。
今ここに書いてる自分の内容だって主観や嘘が混じっているかもしれないです。
ただし、プログラムは嘘をつきません。書いたコードの通りに動きます。

なので、まずはプログラムの動きを理解する必要があります。
その1つの手段としてデバッグが存在しますから、toll_treeさんには是非この機に覚えて欲しいということです。

デバッガの導入について

基本的にはIDE(統合開発環境)を使う必要があるようです。
NetBeansPHPStormで少し調べてみてください。

他にもたくさんあると思いますが、ボランティアとしてはここまでです。
他にデバッグできる手段があるかどうかは、是非調べてみてください。

プログラムの動きが理解できないときに「怖い」「動きが気になる」と考え、そしてそれを解決するために「デバッグをしなくては」と思えてきたら良い傾向です。

今回のようにデバッグで解決するような質問は無くなり、コーディングによるバグが減り、自己解決ができるようになるのですから。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/17 18:28

    BluOxyさん
    この回答、今後たまに直リンクさせてもらうかもしれません。
    本件だけでなくPHPに限らず活用できる概念ですし私が書くものより断然出来がいいです(あと当質問者のような人には特に何度も振りかえってもらいたい)

    キャンセル

  • 2019/06/17 18:40

    はい、活用できる機会があれば是非引用してください。

    キャンセル

  • 2019/06/17 18:42

    ありがとうございます。

    キャンセル

+2

「入ってないから」他なりません。
PHP側はきたデータをそのまま処理しているだけなので
「入っている」という思い込みは通用しません。

デバッグでデータ確認するだけで解決します。

あと「データが入っている前提」の危ない実装をやめることですね。
変数、配列の扱い方の基礎なのでそこは調べてください。


初心者さんなので一応ヒント:

foreach (['0', '1', '2', '3', '4', '5', '6'] as $dayOfWeek){
    echo $dayOfWeek[0];
}
//0123456
foreach (['1','1'] as $dayOfWeek){
    echo $dayOfWeek[0].PHP_EOL;
}
//1
//�

配列や変数というより、文字列の基礎(例11など参照)ですね。
むしろ[0]固定の時もエラーが出ないだけでちゃんと表示されないはずですけど。

作った配列には0~6は存在するけどそれぞれのループではそれぞれ順番に定義した文字列が来ているよね
という話。
配列の基礎、foreachの基礎も学習しなおしましょう。

var_dump(['日', '月', '火', '水', '木', '金', '土']);

foreach (['日', '月', '火', '水', '木', '金', '土'] as $dayOfWeek){
    var_dump($dayOfWeek);
}


それにdayOfWeekって「曜日」です。
せっかく意味がある変数をつけているのに・・・。

「エラーの理由」が質問なのでこれまで。
理由がわかったらどうしたらいいかは考えれば分かると思います。

calender.blade.php
calender_table

前も指摘してますがLarabelって書くより恥ずかしいスペルミスです(中学で習うはずです)
英語苦手ならGoogle翻訳使うか、ローマ字表記にしてください。
「書いたとおりにしか動かない」のがプログラムなので、こういう細かいスペルを気にしない人は必ず「思った通りに動く」と思い込みでプログラムを組んで無用な浪費をし続けることになります。
これまでの質問で何度も「思った」で失敗していると思います。学習しましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/17 08:54

    それに。
    月によって固定されない1日や末日の曜日を求めるならともかく、始めが日曜で終わりが土曜って決まってるヘッダなんだからわざわざループ使うメリットがない。
    直書き7行で済むのにループと内部の分岐で9行も使って、長くなってしまってる。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる