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

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

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

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

Q&A

解決済

3回答

262閲覧

PHPで簡潔にテーブルを表示をしたい

nobodytolove123

総合スコア61

PHP

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

0グッド

1クリップ

投稿2017/11/20 05:53

###前提・実現したいこと
PHPでアルバイトの一ヶ月のシフトを送信するプログラムを作っていて現在、シフトの
入力テーブルを作成しています。

テーブルには下の様に月ごとの日付(例、1日‐30日まで)とhtmlのinput要素をセットにして
あります。

<tr><th>日付</th></tr> <td><input></td>

望みとしては一週間ごとに段落が折り返すようにしてほしいのと
for文やforeach文で簡潔にまとめて書きたいです。

自分で試してみてなんとかテーブルを作成できましたがfor文が6つもできてしまい
どうしても無駄が省けないのです。
お知恵をお借りしたいです、よろしくお願いします。

###該当のソースコード

PHP

1 <table class='table'> 2<?php 3 $array = []; 4 for($i = 0;$i < 7;$i++){ 5 $array[$i] = ""; 6 } 7 $k = 0;//条件 8 $j = 1;//表示 9 $i = 1;//表示 10 11 foreach($array as $row){ 12 print "<th class='th'>{$j}日</th>"; 13 $k++; 14 $j++; 15 $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print ""; 16 } 17 $k = 0; 18 foreach($array as $row){ 19 print "<td><input name='{$i}' class='time' value=''></td>"; 20 $k++; 21 $i++; 22 $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print ""; 23 } 24 ?> 25 26 </table> 27 <table class="table"> 28 <?php 29 30 $k = 0; 31 foreach($array as $row){ 32 print "<th class='th'>{$j}日</th>"; 33 $k++; 34 $j++; 35 $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print ""; 36 } 37 $k = 0; 38 foreach($array as $row){ 39 print "<td><input name='{$i}' class='time' value=''></td>"; 40 $k++; 41 $i++; 42 $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print ""; 43 } 44 45 ?> 46 </table> 47 <table class="table"> 48 <?php 49 50 $k = 0; 51 foreach($array as $row){ 52 print "<th class='th'>{$j}日</th>"; 53 $k++; 54 $j++; 55 $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print ""; 56 } 57 $k = 0; 58 foreach($array as $row){ 59 print "<td><input name='{$i}' class='time' value=''></td>"; 60 $k++; 61 $i++; 62 $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print ""; 63 } 64 65 ?> 66 </table> 67 <table class="table"> 68 <?php 69 70 $k = 0; 71 foreach($array as $row){ 72 print "<th class='th'>{$j}日</th>"; 73 $k++; 74 $j++; 75 $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print ""; 76 } 77 $k = 0; 78 foreach($array as $row){ 79 print "<td><input name='{$i}' class='time' value=''></td>"; 80 $k++; 81 $i++; 82 $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print ""; 83 } 84 85 ?> 86 </table> 87 <table class="table"> 88 <?php 89 $l = $i; 90 $l = date('t') - (--$l); 91 92 for($n = 0;$n < $l;$n++){ 93 print "<th class='th'>{$j}日</th>"; 94 $k++; 95 $j++; 96 } 97 98 echo "<tr>"; 99 100 for($n = 0;$n < $l;$n++){ 101 print "<td><input name='{$i}' class='time' value=''></td>"; 102 $k++; 103 $i++; 104 } 105 106 107 ?>

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

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

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

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

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

guest

回答3

0

ベストアンサー

<tr><th>日付</th></tr>
<td><input></td>

これに囚われている所が負けパターンですね。
よくよく考えてみてください、別にテーブルで改行して別のセルに行く必要はどこにもありませんよ。
CSSで改行したように認識出来るように表示をいじれば良いのです。

というわけで1セルの中に日付とinputを両方入れる方向で考えましょう。
例えば1週間で考えればこうですね。

PHP

1<?php 2$days = [ 3 ["d" => 1], 4 ["d" => 2], 5 ["d" => 3], 6 ["d" => 4], 7 ["d" => 5], 8 ["d" => 6], 9 ["d" => 7], 10]; 11?> 12<table> 13 <tr> 14 <th>月曜</th> 15 <th>火曜</th> 16 <th>水曜</th> 17 <th>木曜</th> 18 <th>金曜</th> 19 <th>土曜</th> 20 <th>日曜</th> 21 </tr> 22 <tr> 23 <?php foreach ($days as $day): ?> 24 <td> 25 <label><?= $day['d'] ?></label> 26 <div> 27 <input name="shift_at_<?= $day['d'] ?>" /> 28 </div> 29 </td> 30 <?php endforeach; ?> 31 </tr> 32</table>

コツは日付達という値を先に作っておいて、後半はHTML生成に集中することです。
またendforeachの書き方はHTML生成するタイミングで使うのと相性が良いので、
私は普段は波括弧を使いますが、HTMLを作る時はendforeachを利用しています。
制御構造に関する別の構文 - PHPマニュアル

でも1ヶ月は5週間もあるじゃないか!
ほんまこのmiyabiとかいう回答者は理想ばっかりで現実見てないな…

ちょっとまってくださいね。
作りたいカレンダーは2次元の表ですよね?
では2次元配列を作りましょう。
二次元配列にする以外は2行増えるだけです。

PHP

1<?php 2$days_by_week = [ 3 [ 4 ["d" => 1], 5 ["d" => 2], 6 ["d" => 3], 7 ["d" => 4], 8 ["d" => 5], 9 ["d" => 6], 10 ["d" => 7], 11 ], 12 [ 13 ["d" => 8], 14 ["d" => 9], 15 ["d" => 10], 16 ["d" => 11], 17 ["d" => 12], 18 ["d" => 13], 19 ["d" => 14], 20 ], 21]; 22?> 23<table> 24 <tr> 25 <th>月曜</th> 26 <th>火曜</th> 27 <th>水曜</th> 28 <th>木曜</th> 29 <th>金曜</th> 30 <th>土曜</th> 31 <th>日曜</th> 32 </tr> 33 <php foreach ($days_by_week as $days): ?> 34 <tr> 35 <?php foreach ($days as $day): ?> 36 <td> 37 <label><?= $day['d'] ?></label> 38 <div> 39 <input name="shift_at_<?= $day['d'] ?>" /> 40 </div> 41 </td> 42 <?php endforeach; ?> 43 </tr> 44 <?php endforeach; ?> 45</table>

このようにPHPは配列を一気に作成しておいて、後で展開する文化です。
配列を制すものはPHPを制す。
覚えておきましょう。

これでfor文6回という質問は、
どうやって2次元配列を作れば良いかという問題に置き換わりました。


まずは座学です。

こちらのページをどうぞ。
array_chunk - PHPマニュアル
ほう、ループを回さなくても簡単に二次元配列が作れるのか…
1週間は7日なので簡単なお仕事ですね。

['d' => xxx]もうんざりする程書きたくないのでfor文にまとめましょう。
因みにその月の日数はcal_days_in_monthで取れるらしいですよ。

今日は11月の中旬なので、12月のシフトが欲しいですね。
早速作ってみましょう。

PHP

1<?php 2$year = 2017; 3$month = 12; 4$end_of_month = cal_days_in_month(GREGORIAN, $month, $year); 5$x = []; 6for ($i = 0; $i < $end_of_month; $i++) { 7 $x[] = ['d' => $i + 1]; 8} 9$days_by_week = array_chunk($x, 7);

ちょっと待て、2017/12/1は金曜日だろ!
このままじゃ月曜から始まってしまうだろ?どうすんだ?

良い質問です。
[PHP]日付から曜日を割り出す
これを使って曜日分だけゴミデータで埋めてしまいましょう。

PHP

1<?php 2$year = 2017; 3$month = 12; 4$end_of_month = cal_days_in_month(GREGORIAN, $month, $year); 5 6$week = ["日", "月", "火", "水", "木", "金", "土"]; // 単なる参考資料 7$dummyDaysList [6, 0, 1, 2, 3, 4, 5]; 8$datetime = date_create(); 9date_date_set($datetime, $year, $month, 1); 10$w = (int)date_format($datetime, 'w'); 11 12$x = []; 13for ($i = 0; $i < $dummyDaysList[$w]; $i++) { 14 $x[] = ['is_dummy' => true]; 15} 16for ($i = 0; $i < $end_of_month; $i++) { 17 $x[] = ['d' => $i + 1, 'is_dummy' => false]; 18} 19$days_by_week = array_chunk($x, 7);

これでほぼ全て片付きましたね。
ただ、ダミーデータは日付を持っていないので、カレンダーを表示しにいくと困りますね。
is_dummyというキーを持たせているので、td要素を吐き出したらif文等で分岐してすぐに抜けてください。

最後の部分はあえて書きません。
ここから先はキミの目で確かめてくれ!

投稿2017/11/20 07:05

miyabi-sun

総合スコア21158

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

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

nobodytolove123

2017/11/20 07:13

ご回答ありがとうございます!すごいですね自分にはない視点でとても驚いています、上記の内容をせっかくなので入れてみたいと思います
miyabi-sun

2017/11/20 07:51

ark0214さんの解答にあった記事も良いやり方だと思いますので、 両者を見比べて良いとこ取りしてってください。
guest

0

こちらのサイトなんかが参考になると思います。
PHPでカレンダーを作成しよう | PHPプログラミングの教科書 [php1st.com]

個人的にはlistで書いて、CSSで折り返させるのが好きです。

投稿2017/11/20 06:28

編集2017/11/20 07:11
chibi144

総合スコア64

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

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

nobodytolove123

2017/11/20 06:34

ご回答ありがとうございます!とても参考になります、早速当てはめてみようかと思います。
miyabi-sun

2017/11/20 07:07

[PHPでカレンダーを作成しよう | PHPプログラミングの教科書 [php1st.com]](https://php1st.com/1001/#11while) ↑のように書くとMarkdownでリンクが作れます。お試しください。
chibi144

2017/11/20 07:12

>miyabi-sunさん ありがとうございます。修正しました。
nobodytolove123

2017/11/20 07:14

なるほど、丁寧に教えてくださりありがとうございます!
guest

0

一度htmlでベタに書いてみて、それをphpに落とし込むとよいでしょう。

投稿2017/11/20 06:23

yambejp

総合スコア114833

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

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

nobodytolove123

2017/11/20 06:26

ご回答ありがとうございます!なるほど確かに僕のコードは分けて書くから煩わしかったのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問