質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

4025閲覧

foreachにて2回回っているかのような現象が起きてしまいます

toll_tree

総合スコア199

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/06/22 02:27

発生している問題・エラーメッセージ

foreachが2回回っているかのような現象が起きてしまっています。何故<p>タグ部分が2回出力されているのかが分かりません。
以下は該当のソースコードを実行した結果になります
イメージ説明

該当のソースコード

php

1<table class="calender_table"> 2 <thead> 3 <tr class="day"> 4 @foreach (['日', '月', '火', '水', '木', '金', '土'] as $dayOfWeek) 5 @if($loop->first) 6 <th class="sunday">{{ $dayOfWeek }}</th> 7 @elseif($loop->last) 8 <th class="saturday">{{ $dayOfWeek }}</th> 9 @else 10 <th>{{$dayOfWeek}}</th> 11 @endif 12 @endforeach 13 </tr> 14 </thead> 15 <tbody> 16 @foreach($dates as $date) 17 18 @if($date->dayOfWeek == 0) 19 <tr> 20 @endif 21 <td> 22 @if($date->month == $current_date->month) 23 {{$date->day}} 24 @endif 25 26 @foreach($current_reserved_date as $reserved_date) 27 28 @if($date->day == $reserved_date->day) 29 30 <p>予約されています</p> 31 32 @else 33 34 <p>空室</p> 35 36 @endif 37 38 @endforeach 39 </td> 40 @if($date->dayOfWeek == 6) 41 </tr> 42 @endif 43 @endforeach 44 </tbody> 45 46 </table>

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use Carbon\Carbon; 7use App\Reservation; 8class Reservecontroller extends Controller 9{ 10 // 11 12 13 public function getCalendarDates($year, $month) 14 { 15 $date = Carbon::parse("$year-$month-1")->locale('ja_JP'); 16 // dd($date); 17 $last = $date->copy()->startOfWeek(); 18 $count = $last->diffInDays($date->copy()->endOfMonth()->endOfWeek()) + 1; 19 // dd($count,$date); 20 for ($i = 0; $i < $count; $i++, $last->addDay()) { 21 $dates[] = $last->copy(); 22 } 23 24 return $dates; 25 26 } 27 28 public function reserve_date() 29 { 30 $current_date = new Carbon(); 31 $current_year = $current_date->year; 32 $current_month = $current_date->month; 33 $dates = $this->getCalendarDates($current_year,$current_month); 34 $reservations = Reservation::get(['reservation_date']); 35 $reservations_array = $reservations->toArray(); 36 // var_dump($reservations_array); 37 // dd(); 38 foreach($reservations_array as $key=> $value ){ 39 $reserved_date[] = Carbon::parse($value['reservation_date']); 40 if($reserved_date[$key]->month == $current_month){ 41 $current_reserved_date[] = $reserved_date[$key]; 42 } 43 } 44 45 46 // foreach($current_reserved_date) 47 48 // dd($current_reserved_date,$dates); 49 50 51 return view('reserve.calender',compact('dates','current_date','current_reserved_date')); 52 53 } 54 55} 56

試したこと

以下はコントローラーファイルで「dd($current_reserved_date,$dates);」とした際の実行結果です。
上から$current_reserved_date,$datesの実行結果になります。
イメージ説明

補足情報(FW/ツールのバージョンなど)

laravel5.8
windows10

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/22 02:42

もう少し丁寧にデバッグしてください。問題がループ内なのは明らかなのですから配列を見ても意味がありません
m.ts10806

2019/06/22 02:52

いつまでcalenderという恥ずかしいスペルミスを引っ張り続けますか? 直せない理由などないでしょう。むしろ直さないことによるデメリットの方が大きい。別の人にも「早く対応した方がいい」と指摘されていたにも関わらず、なぜ直しませんか?
guest

回答2

0

2回回っているわけではありません。
$current_reserved_dateにデータが2本あってどの日でもその分だけ回しているだけです。
そして日でしか比較していないため10日以外は全てelseに入りますね。今の作りだと年月関係なく。

つまり今の作りだとデータが増えれば増えるほどデータの件数だけ「空室」と表示されることになります。
$current_reserved_dateのkeyを0から連番ではなく年月日にしておき、そのキーとカレンダーループの年月日全てで比較したほうが良いでしょう。

なので、$reservations_arrayから$current_reserved_dateを作るロジックから見なおす必要があります。

もっと言えばReservation::get(['reservation_date']);も。
カレント年月のカレンダーしか表示させないのでしたら年月で絞ったデータのみを取得するべきです。
でないとデータが増えれば増えるほど無用なループが回り、パフォーマンスがどんどん悪くなります。

月のカレンダーに時間を表示させる必要があるかないかも検討が必要ですし、通常は表示させません。「その日のデータがあるかないか(または件数)」のみ分かればいいので、時間まで込みのデータは不要と思います。
group byで年月日で絞って日付毎のデータ件数だけ取っては。

投稿2019/06/22 03:05

編集2019/06/22 03:13
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

どう直したらいいかは、この学習段階では難しそうなので。

$current_reserved_dateを作るときに、年月日を連結した文字列をキーにした連想配列にするといいと思います

投稿2019/06/22 13:17

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/23 11:20 編集

質問者自身が「この学習段階では難しそうなので」を認識してもらえればいいのですが (年月日キーの件は私もそれとなく触れてますがその前のデータをなんとかすべきと気づいてもらえたらいいんですけども…私を意地でも無視したいらしいので。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問