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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

1794閲覧

php 時間表で困ってます

syuichiroh

総合スコア4

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/08/23 11:46

前提・実現したいこと

時間表をforとforeachで表示しました。
[for]の中の「'10:00'」の記述箇所ですが、
データベースより取得した複数の値を順次、入れたいです。

配列内容は例として以下です


array(7) {
[0]=>
string(5) "00:00"
[1]=>
string(5) "00:15"
[2]=>
string(5) "01:45"
[3]=>
string(5) "00:30"
[4]=>
string(5) "01:15"
[5]=>
string(5) "01:30"
[6]=>
string(5) "01:45"
}


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

エラーメッセージ

該当のソースコード

php

1$lines = []; 2$line = ''; 3$time_max =15*4 * 24-1; 4$t = strtotime('00:00'); 5 6// foreach ( $arylist as $ary){ 7for($time = 0; $time <= $time_max ; $time +=15) { 8 $time_set = date('H:i', strtotime("+$time minutes", $t)); 9 if( $time_set == '10:00'){ 10 $line = '<td>' . $time_set . '</td> 11 <td><label><input type="radio" name="'.$time_set.'"value="re_open" >re_open</label></td>'; 12 }else{ 13 $line = '<td>' . $time_set . '</td><td><label><input type="radio" name="'.$time_set.'"value="stop" >stop</label></td>'; 14 } 15 $lines[] = '<tr>' . $line . '</tr>'; 16 $line = ''; 17} 18 19// html本文 20 21foreach ($lines as $line){ 22 echo $line; 23} 24 25

試したこと

for内容に0から++で上がっていく数字をつけてprintで入れてみたり、
loop処理を足してみたり、色々試したのですが、時間列が崩れたり、配列内の一部しか反映されなかったり、正しい記述が分からない、出来ない状態で困りました。
ご指導願いたいです。
よろしくお願いします。

補足情報

配列数はデータベースから引っ張ってきますので都度 増減します。

必要ないかもしれませんが、作成している大まかな流れを記述しておきます。

➀時間表 input type radio (複数の為、name属性不統一)をpostから$_SESSIONへ。
➁SQLでINCERT INTO 。 db入れ込み。
後、
➂SQLでDBから取り出し。
➃時間表で、DB登録した情報列だけ、別の記述を表す。

この➃をしたいのです。
よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/08/23 12:13

データベース上のテーブル構造を、CREATE TABLE文で示すことはできますか?
syuichiroh

2020/08/24 01:04

create table booking_datetime( id int(11) primary key autoincrement, day varchar(11), time varchar(11), link_id int(11), ) となります。(実際はcreated, modifiedも作成してます)
guest

回答3

0

データベースがなんなのか、
どういうふうにデータを保持しているのか、
さっぱりわからない状態でなんとなく助言します。

「時刻」データっていうと0時~23:59:59までのデータかもしれませんが、
データ処理の都合上、日付も加えて「日時」としてデータ管理した方が、
割と便利なんじゃないかと私は思っています。

MySQLやPostgreSQLでTIMESTAMP型を使えば、
日付データをもとにTIMESTAMP型に変換して
特定の日付のデータに絞り込んで抽出したりするのができます。
日付と時刻でカラムを分けてしまうと、
日付と時刻でそれぞれインデックスを設けて高速化しないといけなかったりします。

PHP上ではDateTimeクラスを使えばデータベースのTIMESTAMP型と親和性が高いです。
PHP: DateTime - Manual
日付だけ欲しい、時刻だけ欲しい、どういう場合でもformat()メソッドで一発です。

そういうクエリーを考えるのもコツが必要なので、
基本的な考え方として、
0:00~23:30のループをしながら、
テーブルのデータと比較して、
一致する時間帯なら云々、そうでないなら云々
ってやればいいんじゃないかな。
ループをデータベース読み出しで回さずに、
時刻用ループカウンタを使って回して、
時間帯ごとの判定を行うっていう。
DateTimeクラスでは、add()/sub()メソッドでDateIntervalクラスを駆使して
正確に時刻の加減算ができます。

php

1<?php 2 3$dt = new DateTime('2020-08-23 00:00:00'); 4while ($dt->format('Y-m-d') == '2020-08-23') { 5 echo $dt->format('H:i') . PHP_EOL; 6 $dt = $dt->add(new DateInterval('PT30M')); 7}

これで30分刻みのループカウンタができています。


PHP: 配列 関数 - Manual
をよく見てもらって、例えば
PHP: array_key_exists - Manual
を使って指定のキーに対応する値を配列が持っているかどうかを検査しながらループカウンタを回すのもご検討ください。

投稿2020/08/23 12:19

編集2020/08/24 02:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

syuichiroh

2020/08/24 01:16

アドバイス有難うございます。 前のコメントにてtableを書きました。 テーブルの day とtime をtimestamp で記録した方が効率が良い事、 理解致しました。有難うございます。 後で修正していきたいと思います。 次いで、問題の核の部分ですが、 先述した上記コードの「10:00」の箇所に配列、変数を入れて時間表を崩さず表示出来るのでしょうか? カスタマーがフォームで複数時間を指定したのが、「10:00」に反映されるとし、単数ならば簡単ですが、複数となると。というところです。  個人的には、現コードでも出来るはずと思っているのですが、今市上手くいかず。 ダメであれば、別の記述にトライします。しかし、本件が上手くいかない理由がわかりません。 for($time = 0; $time <= $time_max ; $time +=15) { に、$j++を足して 10:00箇所に$dbtime[$j]としてみても、 配列の一部しかとれてなかったりします。 理由がわかりません。 別で、for をfor で囲ったりしたり、、、これは問題外です。 納得がいった上で、次の手法に移りたいと思います。解決出来ないですかね。。。。。
syuichiroh

2020/08/24 04:04

皆様のヒントを頼りに解決に至る事が出来ました。 有難うございました。 timestampのアドバイスも実装して活かしたいと思います。 また、よろしくお願いします。
guest

0

自己解決

皆様のヒントを頼りに色々試した結果、解決に至りました。 有難うございます。
参考までに、詳細記述しておきます

10:00の箇所はDBより取得するので配列(仮$arylist[0]))を用意。
この時、送られてきた複数値は、[0]を変える事で取得できた。
ここに変数を追加 $arylist[$j]。 $j=0; を設けて、数字を入れ替えて取得できた。
$jはif文のtrue 毎に加算しなければならないのでif文のtrueの末尾に$j++とした。
これで本文は完了だが、問題があった。

//変数用意
$lines = [];
$line = '';
$time_max =15424-1;
$t = strtotime('00:00');
$j = 0;

for($time = 0; $time <= $time_max ; $time +=15) {
$time_set = date('H:i', strtotime("+$time minutes", $t));

if($time_set ==$arylist[$j]){ $line = '<td>' . $time_set . '</td> <td>売止中</td>'; $j++; }else{ $line = '<td>' . $time_set . '</td><td><label><input type="radio" name="'.$time_set.'"value="'.$time_set.'" >stop</label></td>'; }

$lines[] = '<tr>' . $line . '</tr>';
$line = '';
}

状況は
取得情報をページに反映させる際、一部適合せず、取得情報全てが反映しない。
理由は、DBから取得した時間がばらばらである事。

array(7) {
[0]=>
string(5) "00:00"
[1]=>
string(5) "00:15"
[2]=>
string(5) "01:45"
[3]=>
string(5) "00:30"
[4]=>
string(5) "01:15"
[5]=>
string(5) "01:30"
[6]=>
string(5) "01:45"
}

この場合、[2]の1:45から[3]の0:30でストップを起こす。
よくよく考えればhtmlの表示される情報は、00:00から24:55まで
上がっていく。
つまり、[3]0:30 を維持して、24:55まで進むのだから
当たり前。

なので、

sql select にorder by asc を入れて、取得順序を整理。

これで、解決にいたりました。。

皆様、本当に有難うございました。
またお願いします。

投稿2020/08/24 03:43

編集2020/08/24 05:50
syuichiroh

総合スコア4

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

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

0

in_arrayでチェックしたらいいんじゃないでしょうか?

PHP

1$check = ['00:00', '00:15', '01:45', '00:30', '01:15', '01:30', '01:45']; 2 3$lines = []; 4$line = ''; 5$time_max =15*4 * 24-1; 6$t = strtotime('00:00'); 7 8// foreach ( $arylist as $ary){ 9for($time = 0; $time <= $time_max ; $time +=15) { 10 $time_set = date('H:i', strtotime("+$time minutes", $t)); 11 if(in_array($time_set, $check)){//in_arrayでチェック 12 $line = '<td>' . $time_set . '</td> 13 <td><label><input type="radio" name="'.$time_set.'"value="re_open" >re_open</label></td>'; 14 }else{ 15 $line = '<td>' . $time_set . '</td><td><label><input type="radio" name="'.$time_set.'"value="stop" >stop</label></td>'; 16 } 17 $lines[] = '<tr>' . $line . '</tr>'; 18 $line = ''; 19} 20 21// html本文 22 23foreach ($lines as $line){ 24 echo $line; 25}

投稿2020/08/24 02:20

jinba

総合スコア310

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

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

syuichiroh

2020/08/24 04:02

皆様のヒントを頼りに解決まで至る事ができました。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問