お世話になります。
文章だと難しいのですが、
例えば、2019年3月1日 10:00〜19:00の時間に対して
下記日時を埋めた時間配列を求めたいと思っています。
2019年3月1日 11:00〜12:00
2019年3月1日 15:15〜16:15
2019年3月1日 18:45〜19:45
出力としては
2019年3月1日 10:00〜11:00
2019年3月1日 12:00〜15:15
2019年3月1日 16:15〜18:45
を出したいと思っております。
何か良い方法は無いでしょうか。
分単位の配列にしないといけないでしょうか。
教えていただけますと幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
年月日時刻の計算って、思った以上にややこしいですよね。
週カレンダーをベースとした、面談予約の仕組みを作成したことがあります。既に埋まった時間枠はグレーアウトして予約が入れられない、という感じでした。
似て非なるものかもしれませんが、たぶん、3月1日の例だけではなく、カレンダーも絡むのでは?、と思いました。
開始年月日時刻、終了年月日時刻をstrtotime(秒単位)で決め打ち(週カレンダーなら日曜10:00から土曜19:00とか)して、whileで1日ずつ回して、さらにその中でwhileで分単位(5分ごととか10分ごととか)で回し、さらにその中でif条件で配列を作成していく方法しか思い付きませんです。
$start = strtotime($start); $end = strtotime($end); while($start <= $end) { $tstart = strtotime(date('Y-m-d', $start)." 10:00"); $tend = strtotime(date('Y-m-d', $start)." 19:00"); while($tstart <= $tend) { // ここに必要条件、除外条件を書いて、必要な配列を組成する。 $tstart = $tstart + 300; // 5分(300秒)ずつ進める } $start = strtotime("+1 day", $start); }
参考になれば幸いです。
投稿2019/03/06 14:49
編集2019/03/07 02:47総合スコア368
0
ベストアンサー
「2019年3月1日 11:00〜12:00」を年月日、開始時間、終了時間に分け、配列に格納してみました。
11:00は1100という数値として扱っております。
php
1function get_vacancy($start = 1000, $end = 1900, $booked = []) 2{ 3 $result = []; 4 5 foreach ($booked as $row) 6 { 7 if ($start < $row[0]) 8 { 9 $a = $start; 10 11 if ($row[0] < $end) 12 { 13 $b = $row[0]; 14 } 15 else 16 { 17 $b = $end; 18 } 19 $result[] = [$a, $b]; 20 } 21 22 if ($start < $row[1]) 23 { 24 $start = $row[1]; 25 } 26 } 27 28 if ($start < $end) 29 { 30 $result[] = [$start, $end]; 31 } 32 33 return $result; 34} 35 36// $taken: 埋まっている時間帯を配列に格納 37$taken = [ 38 '2019-03-01' => [ [1100, 1200], [1515, 1615], [1845, 1945] ], 39 '2019-03-02' => [ [1000, 1100], [1115, 1145], [1500, 1630] ], 40 '2019-03-03' => [ ], 41 '2019-03-04' => [ [900, 1100], [1115, 1145], [1500, 1930] ], 42 '2019-03-05' => [ [900, 1100], [1045, 1145], [1500, 1630], [1615, 1715] ] 43]; 44 45// $vacancies: 空き時間帯の配列 46$vacancies = []; 47 48foreach ($taken as $date => $times) 49{ 50 $vacancy = get_vacancy(1000, 1900, $times); 51 $vacancies[$date] = $vacancy; 52} 53 54 55// 以下、出力 56if ($vacancies) 57{ 58 echo "<ul>"; 59 foreach ($vacancies as $date => $times) 60 { 61 $date_f = date('Y年n月j日', strtotime($date)); 62 63 foreach ($times as $arr) 64 { 65 $time_f1 = substr(strval($arr[0]), -4, 2) . ":" . substr(strval($arr[0]), -2); 66 $time_f2 = substr(strval($arr[1]), -4, 2) . ":" . substr(strval($arr[1]), -2); 67 68 echo "<li>" . $date_f . $time_f1 . "〜" . $time_f2 . "</li>"; 69 } 70 } 71 echo "</ul>"; 72}
投稿2019/03/06 17:05
編集2019/03/07 07:28総合スコア1907
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。