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

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

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

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

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Laravel 5

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

Q&A

解決済

1回答

224閲覧

if文の分岐がうまくいきません

toll_tree

総合スコア199

Laravel

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

PHP

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Laravel 5

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

4グッド

0クリップ

投稿2019/07/12 08:39

編集2019/07/12 10:29

以下のコードにつきまして、お聞きしたいことがあります。

<div class="reserve_time_list"> @foreach(range(10,18) as $key => $hour) <div class="reserve_time_block flex"> @foreach(array('reserve_status_left' => '00','reserve_right' => '30') as $className => $minute) @if($hour == 18 && $minute == 30) <span>&nbsp;</span> @else <div class="{{$className}} reserve_status flex"> <p>{{$hour}}:{{$minute}}</p> @if(isset($occupied[$key])) @if($hour . ':'. $minute == $occupied[$key]) @php var_dump($occupied); @endphp <p class="no_reservation">✖</p> @else <form action="/reserve/infomation" method="post"> {{ csrf_field() }} <input type="hidden" name="time" value="{{$hour}}時{{$minute}}分"> <input type="hidden" name="date" type="submit" value="{{ $date_display_formt }}"> <input type="hidden" name="dayOfWeek" value="{{ $day }}"> <input class="calendar_button reserved_time_button" type="submit" value="〇"> </form> @endif @else <form action="/reserve/infomation" method="post"> {{ csrf_field() }} <input type="hidden" name="time" value="{{$hour}}時{{$minute}}分"> <input type="hidden" name="date" type="submit" value="{{ $date_display_formt }}"> <input type="hidden" name="dayOfWeek" value="{{ $day }}"> <input class="calendar_button reserved_time_button" type="submit" value="〇"> </form> @endif </div> @endif @endforeach </div> @endforeach </div>

現在、こちらのコードの$occupiedには下記の3つの要素が入っています。
イメージ説明
自分の想定ですと、@if($hour . ':'. $minute == $occupied[$key])こちらの比較において、
<p>{{$hour}}:{{$minute}}</p>ここの部分が「10:00」「10:30」「11:00」の時は、<p class="no_reservation"></p>が出力されると思うのですが、現状「10:00」のブロックでしか、<p class="no_reservation"></p>ここは出力されません。
追記です
@if(isset($occupied[$key]))こちらの行の後に、@php var_dump($key); @endphpとして、keyを確認しましたら、@if($hour . ':'. $minute == $occupied[$key])ここの比較で、$hour . ':'. $minuteが10:00の際に「$occupiedのkeyは「0」を参照するのですが、10:30の際も「0」が参照されていることが分かりました。
現状、$keyが1時間おきにしかプラスされないため、30分ごとの比較ができない状況となってしまっています。
打開策などありましたら、教えて頂けましたら幸いです。

aae_11, y_waiwai, newyee👍を押しています

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

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

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

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

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

hentaiman

2019/07/12 08:49

ifに使ってる値をifよりも外側の箇所でデバッグ用に出力してみたら分かるんじゃないの
m.ts10806

2019/07/12 09:28 編集

読んでも意味は分かってなさそうなので削除
m.ts10806

2019/07/12 09:29 編集

何を言っても回答が踏み潰され続けるのが明らかなので削除。 期待は薄いが運営に対処を依頼。
toll_tree

2019/07/12 09:06

@hentaimanさん @if($hour . ':'. $minute == $occupied[$key])こちらのブロックの外側で、 @php var_dump($hour,$minute,$occupied); @endphpとしてみて検証してみましたら、<p>{{$hour}}:{{$minute}}</p>こちらが10:00から12:00までの部分で、$occupiedの中身全てが出力されていました。その為、$hour,$minuteとの、比較はされているのではないかなとは思っているんですよね...
m.ts10806

2019/07/12 09:27 編集

理解は得られそうにないので削除。
m.ts10806

2019/07/12 09:23

hentaimanさん 本来は全部作り直さないと今後どうにもならないのは明白としてとりあえず今回のだけだとin_arrayで済みそうに思うのですが如何でしょうか。
hentaiman

2019/07/12 09:27

じゃあ$keyも一緒に出力してデバッグしてみましょう。 そもそも@foreach(range(10,18) as $key => $hour)が何やってるか理解してますか? 分からなければkeyとhourを出力して確認しましょう。この部分だけ単発でphp作って確認してもいいぐらいだ。 > その為、$hour,$minuteとの、比較はされているのではないかなとは思っているんですよね... 思っているのは思っているでいいと思いますが、実際の動作は思い通りにいってないのだからもっと色んな箇所で値出力するとかしてデバッグしましょう。
toll_tree

2019/07/12 09:55 編集

@hentaimanさん アドバイスありがとうございます。 >@foreach(range(10,18) as $key => $hour)が何やってるか理解してますか? ここにつきましては、10~18までの数字の配列を作り、foreachにより繰り返しを行っていると理解しています。 var_dumpにて$keyを出力してみましたら、keyが一つずつずれていました... <p>{{$hour}}:{{$minute}}</p>ここが10:00の際に、keyは1なのですが、10:30分の際も「1」が参照されていました...1時間ごとにkeyが1つ増えるといった感じになってしまっていました。取り敢えず、修正に着手してみたいと思います。
hentaiman

2019/07/12 10:25

mtsさん> そうですね。質問文の最後だけ読んでやりたいであろう事を考えるとin_arrayにするだけで対応できますね。やりたい事が予想の通りだとしたらですけど。 toll_treeさん> > var_dumpにて$keyを出力してみましたら、keyが一つずつずれていました... そこはズレているって考え方に落ち着いてしまっていいんですか?考え直した方がいいです。 それに10:00でkeyが1ならifに入らないので×自体出ないでしょ。デバッグする個所に依るけどkeyは0,1,2,3順番に出ると思いますが、一体どんなデバッグしてるんですか?
toll_tree

2019/07/12 10:28

@hentaimanさん あ、$keyに関しましては、10:00の際の$occupiedのキーは0の間違いでした...
hentaiman

2019/07/12 11:00

mtsさんが最初の方のコメントで言ってたと思うけど、なんでいい加減に作ったkeyを配列のkeyに使ってしまうの? それからin_arrayって書いてあるんだし試しにin_array使ってみたらいいじゃない?key指定もいらないしね。使いたくない理由があるならそれを書いた方がいい。
BluOxy

2019/07/12 11:03 編集

$occupied[$key]がNULLかどうかで出力するHTML要素を分けていますが、これって意図通りの実装ですか? なんだか見やすくしたコードが意味もなく複雑になっているように見えます。
toll_tree

2019/07/12 11:08 編集

@BluOxyさん はい。@if(isset($occupied[$key]))ここで分けておりますのは、$occupiedに要素が存在しなかった場合にエラーが発生してしまいました為、そこを回避する為、issetにて、チェックをつけました...
toll_tree

2019/07/12 11:19

@hentaimanさん in_arrayで何に対して、チェックをかければ良いでしょうか...?
hentaiman

2019/07/12 11:38

え!?リストにある時間なら×を表示してそれ以外はフォームを表示したいんですよね? それならループ作った時間がその配列の中にあるかどうか確認だけすればいいので、in_array使えばkey指定してissetする必要も無いし=で比較する必要も無いけど in_arrayの存在自体を今知ったのならマニュアル見ながら色々試すといいでしょう。in_arrayがどんな動作をするかをしれば何に対してチェックをするか?という質問自体が出て来ないです。
toll_tree

2019/07/12 11:39

あ、なるほど。。。
guest

回答1

0

ベストアンサー

Bladeは全く触ったことがないし、Bladeに関するドキュメントを読んでないことが一度もないけど、書いてみました。

Blade

1<div class="reserve_time_list"> 2 @foreach(range(10, 18) as $hour) 3 <div class="reserve_time_block flex"> 4 @foreach([['reserve_status_left, 0], ['reserve_right', 30]] as list($className, $minute)) 5 @if($hour === 18 && $minute === 30) 6 <span>&nbsp;</span> 7 @else 8 <div class="{{$className}} reserve_status flex"> 9 <p>{{sprintf("%02d:%02d", $hour, $minute)}}</p> 10 @if(in_array(sprintf("%02d:%02d", $hour, $minute), $occupied)) 11 <p class="no_reservation">✖</p> 12 @else 13 <form action="/reserve/infomation" method="post"> 14 {{csrf_field()}} 15 <input type="hidden" name="time" value="{{sprintf("%02d", $hour)}}時{{sprintf("%02d", $minute)}}分"> 16 <input type="hidden" name="date" type="submit" value="{{$date_display_formt}}"> 17 <input type="hidden" name="dayOfWeek" value="{{$day}}"> 18 <input class="calendar_button reserved_time_button" type="submit" value="〇"> 19 </form> 20 @endif 21 </div> 22 @endif 23 @endforeach 24 </div> 25 @endforeach 26</div>

PHPは苦手ですし、Laravelも作ったことが無いので、正常に動作するかは全く保証できません。上のコードに関する質問とかは答えられないと思いますので、予めご了承ください。

LaravelやBladeに詳しい方から見て、間違っているようであれば、低評価をお願いします。一つでも低評価が付いていれば、間違っていると思われますので、このコードは参考にしないでください。

投稿2019/07/12 12:00

raccy

総合スコア21735

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

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

m.ts10806

2019/07/12 12:23

欲を言えばというところは多々ありますけどこの質問内容だけどうにかするには充分だと思います。 ちゃんとするならもっと根本からどうにかしないといけないし、質問者本人はそれに気づくこともなく、たぶん周りが何を言ってるかもわかってないので、このくらいでいいと思います。
toll_tree

2019/07/12 13:27

@raccyさん ご回答ありがとうございました。 「@foreach([['reserve_status_left', 0], ['reserve_right', 30]] as list($className, $minute))」 こちらの配列の指定方法や、list関数を使用する点など、勉強になりました。
m.ts10806

2019/07/12 20:50 編集

回答内容をよく読んでないのがわかるコメント。コード以外のところを全く読まない=コードだけよこせ というスタンスがよく見えますね。これまでもずっとそう。 元のコードも結局もらったものだし、そのコードの作者に「見やすくしたコードを意味もなく複雑になっている」と言われているし。 ペアプロ依頼したいならQAサイトは不適当。というか作業依頼で他者に作ってもらってるじゃないですか(しかもPHPメインじゃない人に) QAサイトってわかってますか。サポートセンターじゃないって知ってますか。 ちなみに私は高評価も低評価もしてませんが、Laravelの機能も使ってないしデータ部分や設定ファイルを駆使すれば本来もっと簡単に組めるのは明白なので、このままこのコードを使い続けるメリットは一切ないとは思います。 別途コメントにも書いたようにin_arrayは単に今回の問題だけを解決する手法であって、本来は全体見直しかけていかないとメンテナンス性も何もない、スパゲッティコードです。 捨てることになるコードなのですよ。単に動けばいいだけのコードですから(これまで回答についたコメントをしっかり読めば分かるはず)。 コードもらっても壊すことしかできてないのも気づけてないようなので、結局延々と自分が埋め込んだバグを赤の他人に直させ続けてるんですよね。 そりゃPHPメインの人も触れなくなるわけです。今回の回答のメインであるin_array、いつ私がコメントしたかわかってますか?ちゃんと拾えてたら数時間早く解決できていたのに。 無視するから何人も巻き込むことになって結局そのコードそのままで超初心者質問してる現状に危機感はないのでしょうか。
hentaiman

2019/07/13 00:23

> 元のコードも結局もらったものだし マジですかこれ。一進二退しつつもちゃんと努力はしてるんだなとか思ってた・・・ 技術の差は人それぞれだしその時々の様々な理由で最適だと思う書き方があるだろうからin_arrayにはこだわらないけど、たかがプログラムなんだから細かくデバッグしていけばどんな書き方してようが必ずやりたい事は出来ると思うんだけどなーと思う。フレームワークを使えるレベルの人(実情はともかくとして)に遠回しとはいえデバッグする個所を聞かれたのは初めてでした。 ついでにlistに感心してるようだけどlistなんてどうでもいいがな、元々のコードならlistいらんし。 listがあろうがなかろうが今回の問題は解決しない、関心を寄せるべきはそこではない。
m.ts10806

2019/07/13 04:03 編集

はい。まじです。 少し前のこの質問が土台です。 https://teratail.com/questions/199884 その回答者が今回の質問にも嘆きともとれるコメントを寄せています。 仕様が分からない中(PHPもそこまで詳しくない方かと思います)、要件を詰めて出された回答のコードなので仕方がない部分はあるのですが、そこまでして出してもらったコードをきちんと理解しないまま付け焼き刃でやって失敗したのが今回の質問だと思います。 そのため、質問する度にレベルが落ちていき、最近は初心者以下になってます。 デバッグもせずPHPマニュアルも確認せず丸投げてるだけです。 デバッグの仕方や観点の回答は何度ももらってます。もとのコードの作者であるBluOxyさんも中級者まででも参考にしてもらいたいくらいの回答を寄せてくれてました。 (ただしBA選んでもコメントは全くしない) だからこの期に及んで「デバッグどうやったら」「どこにin_arrayを」なんて言ってるのがおかしいのです。フレームワークなのに点の質問ばかりなのがおかしいのです。 120以上質問してきてこの状態なのが全てですね。 おおよそ殆どの人が「プログラムなんて諦めて別の道探すべき」と感じてるのではないでしょうか。このままで5年経っても現場では使い物にならないし、趣味だとしてもこれにかけてる時間は何もならないでしょうね。暇潰しにも。
mikkame

2019/07/13 04:06

https://okwave.jp/qa/q2122395.html 前回の質問がまんまこれなんだよなぁ。 プログラマーが向いているかどうかはおいといて、人の話が聞けないのは一緒に働くとしたら厳しすぎる
m.ts10806

2019/07/13 04:17

No.10の回答に近いようなコメントや回答が私以外にも寄せられてるけど全て無視されてますからね。怪しくなってきたら逃亡に近い形で一切反応しなくなる。 ちゃんと聞いてたら現場でも通用するレベルになれてたはずのものを全部踏み潰してきてるように思います。向いてるかはある程度私見ですが(思ってるひとは多そうだけど)、本人の資質によるものが大きいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問