🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1387閲覧

phpでカレンダーと用事がある日を分かるようにしたい

kenichi_myk

総合スコア14

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/10/24 03:10

編集2019/10/24 05:04

phpでカレンダーと用事がある日を分かるようにしたい

初めて質問します。
phpを学び始めて2~3ヶ月の初心者です。

現在、phpでカレンダーを制作しているのですが、予定がある日の表示がうまくできずに困っています。

##発生している問題・エラーメッセージ
カレンダーを表示させる事はできましたが、予定の表示が最後しか表示されません。

php

1calendar.php 2<?php 3require './data.php'; 4 5$base_url = 'http://****/calendar_test/'; 6 7function funcIsAjax(){ 8 if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 9 return true; 10 11 return false; 12} 13 14if(funcIsAjax()) header("Content-type: text/plain; charset=UTF-8"); 15else {header("Location: {$base_url}"); exit;} 16 17date_default_timezone_set('Asia/Tokyo'); //タイムゾーンの設定 18 19$today = $_POST; 20extract($today); 21 22$thisMonth = new DateTime($today); 23$dt = clone $thisMonth; 24$prev = $dt->modify('-1 month')->format('Y-m'); 25$dt = clone $thisMonth; 26$next = $dt->modify('+1 month')->format('Y-m'); 27 28$yearMonth = $thisMonth->format('Y F'); 29$month = $thisMonth->format('Y-m'); 30 31// カレンダー表示 32// 前月表示 33$tr = '<div class="cal_tr">'; 34$tail = null; 35//前月の最終日を習得 36$lastDayOfPrevMonth = new DateTime('last day of ' . $yearMonth . ' -1 month'); 37while ($lastDayOfPrevMonth->format('N') < 7) { 38 $tail = sprintf('<div></div>', $lastDayOfPrevMonth->format('d')) . $tail; 39 $tail = sprintf('<div class="cal cal_td empty"><div class="cal_body"></div></div>', $lastDayOfPrevMonth->format('d')) . $tail; 40 $lastDayOfPrevMonth->sub(new DateInterval('P1D')); 41 $prevmanth = $lastDayOfPrevMonth->format('Y-m'); 42} 43 44// 当月表示 45$body = null; 46$period = new DatePeriod ( 47 new DateTime('first day of' . $yearMonth), 48 new DateInterval('P1D'), 49 new DateTime('first day of' . $yearMonth . '+1 month') 50); 51 52$today = new DateTime('today'); 53 foreach ($period as $day) { 54 if ($day->format('N') === '1'){ 55 $body .= '</div></div>'; 56 $body .= '<div class="cal_tr">'; 57 } 58 $days = $day->format('Y-m-d'); 59 60 foreach($holiday as $key) { 61 $id = $key['id']; 62 $user = $key['account_id']; 63 $kana = $key['account_kana']; 64 $from = $key['datetime_from']; 65 $to = $key['datetime_from']; 66 $type = $key['holiday_type']; 67 } 68 if($from == $days) { 69 $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; 70 $body .= sprintf('<div class="cal cal_td" data-date="' . $days . '"><div class="cal_date day_%d %s">%d</div><div class="cal_plan"></div><div class="cal_body"><div class="area_btn" data-user="' . $user . ' data-user="' . $kana . ' "data-from="' . $from . '" data-to="' . $to . '" data-type="' . $type . '">' . $type . '/' . ' ' .$user .'</div></div></div>', $day->format('w'), $todayClass, $day->format('d')); 71 } else { 72 $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; 73 $body .= sprintf('<div class="cal cal_td" data-date="' . $days . '"><div class="cal_date day_%d %s">%d</div><div class="cal_plan"></div><div class="cal_body"></div></div>', $day->format('w'), $todayClass, $day->format('d')); 74 75 } 76 } 77 78// 次月表示 79$head = null; 80$firstDayOfNextMonth = new DateTime('first day of' . $yearMonth . '+1 month'); 81// var_dump($firstDayOfNextMonth->format('N')); 82while($firstDayOfNextMonth->format('N') > 1) { 83 $head .= '<div class="cal cal_td empty">' . $firstDayOfNextMonth->format('d'); 84 $head .= '<div class="cal_body"></div>'; 85 $head .= '</div>'; 86 87 $firstDayOfNextMonth->add(new DateInterval('P1D')); 88 $nextMonth = $firstDayOfNextMonth->format('Y-m'); 89} 90 91echo $tr . $tail . $body . $head; 92 93?>

php

1data.php 2<?php 3$holiday[] = array( 4 'id'=> '0111' 5 ,'account_id' => '山田 太郎' 6 ,'account_kana' => 'ヤマダ タロウ' 7 ,'datetime_from' => '2019-10-23' 8 ,'datetime_to' => '2019-10-23' 9 ,'holiday_type' => '有休' 10); 11$holiday[] = array( 12 'id'=> '0112' 13 ,'account_id' => '山本 次郎' 14 ,'account_kana' => 'ヤマモト ジロウ' 15 ,'datetime_from' => '2019-11-10' 16 ,'datetime_to' => '2019-10-12' 17 ,'holiday_type' => '有休' 18); 19$holiday[] = array( 20 'id' => '0113' 21 ,'account_id' => '田中 三郎' 22 ,'account_kana' => 'タナカ サブロウ' 23 ,'datetime_from' => '2019-09-10' 24 ,'datetime_to' => '2019-09-11' 25 ,'holiday_type' => '有休' 26); 27 28?>

##試したこと
index.phpをロードしたらAjaxでcalendar.phpを読みに行く仕組みになっています。
foreachの入れ子の仕方、if文の分岐の仕方等トライしてみましたがうまくいきません。

プログラミングを始めてまだ初心者で、まだまだ理解できていない点も多々あるかと思いますがよろしくお願いします。

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

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

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

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

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

m.ts10806

2019/10/24 04:22

すごく細かいですが calendar です。 これ間違えたままだと後々恥ずかしい想いをすることになります。
m.ts10806

2019/10/24 04:30

calender_test ↑ここのことです
kenichi_myk

2019/10/24 05:06

ありがとうございます。 修正しました。 確かに誤字とかは後々恥ずかしいですね。
guest

回答1

0

ベストアンサー

PHP

1 foreach($holiday as $key) { 2 $id = $key['id']; 3 $user = $key['account_id']; 4 $kana = $key['account_kana']; 5 $from = $key['datetime_from']; 6 $to = $key['datetime_from']; 7 $type = $key['holiday_type']; 8 } 9 if($from == $days) { 10 $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; 11 $body .= sprintf('<div class="cal cal_td" data-date="' . $days . '"><div class="cal_date day_%d %s">%d</div><div class="cal_plan"></div><div class="cal_body"><div class="area_btn" data-user="' . $user . ' data-user="' . $kana . ' "data-from="' . $from . '" data-to="' . $to . '" data-type="' . $type . '">' . $type . '/' . ' ' .$user .'</div></div></div>', $day->format('w'), $todayClass, $day->format('d')); 12 } else { 13 $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; 14 $body .= sprintf('<div class="cal cal_td" data-date="' . $days . '"><div class="cal_date day_%d %s">%d</div><div class="cal_plan"></div><div class="cal_body"></div></div>', $day->format('w'), $todayClass, $day->format('d')); 15 16 }

$holidayを回し終わった後に比較では配列の最後しか比較されませんよ

追記

例置いときますね

PHP

1 $sch_html = ''; 2 foreach($holiday as $key) { 3 $id = $key['id']; 4 $user = $key['account_id']; 5 $kana = $key['account_kana']; 6 $from = $key['datetime_from']; 7 $to = $key['datetime_from']; 8 $type = $key['holiday_type']; 9 10     if($from == $days){ 11 $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; 12 $sch_html = sprintf('<div class="cal cal_td" data-date="' . $days . '"><div class="cal_date day_%d %s">%d</div><div class="cal_plan"></div><div class="cal_body"><div class="area_btn" data-user="' . $user . ' data-user="' . $kana . ' "data-from="' . $from . '" data-to="' . $to . '" data-type="' . $type . '">' . $type . '/' . ' ' .$user .'</div></div></div>', $day->format('w'), $todayClass, $day->format('d')); 13 } 14 } 15 if($sch_html != '') { 16 $body .= $sch_html; 17 } else { 18 $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; 19 $body .= sprintf('<div class="cal cal_td" data-date="' . $days . '"><div class="cal_date day_%d %s">%d</div><div class="cal_plan"></div><div class="cal_body"></div></div>', $day->format('w'), $todayClass, $day->format('d')); 20 }

投稿2019/10/24 04:39

編集2019/10/24 06:24
hanhunhun

総合スコア100

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

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

kenichi_myk

2019/10/24 05:32

それぞれのデータを反映させかつ綺麗な形でカレンダーに表示させたいです。
hanhunhun

2019/10/24 05:42

デザインに関してはここでは範疇外なので割愛させていただきます。 このシステムの理想型は表示している月に該当する予定をその日付の場所に表示するものだと思います そしてその処理の例として予定が格納された配列をループでひとつづつ取得し、表示月の日にちと予定の日にちが一致すればその表示月日に予定を反映させたHTMLを生成する といったものだと思いますが 記載されているソースだと予定が格納された配列をループでひとつづつ取得し、すべて取得し終えた後に表示月の日にちと予定の日にちの比較をされています。 なので最後に登録した予定しか反映しない状態です。
hanhunhun

2019/10/24 05:44

ちなみに自分が記載したソースコードは答えではなく間違い部分の抜粋です
kenichi_myk

2019/10/24 06:03

まさに「表示している月に該当する予定をその日付の場所に表示するものだと思います そしてその処理の例として予定が格納された配列をループでひとつづつ取得し、表示月の日にちと予定の日にちが一致すればその表示月日に予定を反映させたHTMLを生成する」が理想型です! foreachの中にifを入れると、dataの個数分だけ、日ができてしまいました。
hanhunhun

2019/10/24 06:18

foreachの中で比較し、一致した場合には一時的な変数(例えば$sch_html)にHTMLを生成・格納し、一致しなければスルー そしてループを抜けた後に$sch_htmlの中身をif文で空かどうかを条件に分け、空じゃなかったら$bodyに$sch_htmlを代入、空だったらもとのif文のelseのHTMLを代入とすればいいんじゃないでしょうか
kenichi_myk

2019/10/24 07:56

もしかしたら、ものすごく基本的な事かも知れませんが、「foreachの中で比較し、一致した場合には一時的な変数(例えば$sch_html)にHTMLを生成・格納し、一致しなければスルー」という部分はどの様に書けばいいのか分かりません。
hanhunhun

2019/10/24 08:07

回答のほうに例を記載しているんで参考にしてください
kenichi_myk

2019/10/24 08:28

できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問