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

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

ただいまの
回答率

91.39%

  • PHP

    15129questions

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

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

解決済

回答 3

投稿 2017/11/20 14:53

  • 評価
  • クリップ 1
  • VIEW 114

前提・実現したいこと

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

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

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

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

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

該当のソースコード

    <table class='table'>
<?php
    $array = [];
    for($i = 0;$i < 7;$i++){
    $array[$i] = "";
    }
    $k = 0;//条件
    $j = 1;//表示
    $i = 1;//表示

    foreach($array as $row){
    print "<th class='th'>{$j}日</th>";
    $k++;
    $j++;
    $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print "";
    }
    $k = 0;
    foreach($array as $row){
    print "<td><input name='{$i}' class='time' value=''></td>";                
    $k++;
    $i++;
    $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print "";              
    }
    ?>

  </table>
  <table class="table">
  <?php

    $k = 0;
    foreach($array as $row){
    print "<th class='th'>{$j}日</th>";
    $k++;
    $j++;
    $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print "";
    }
    $k = 0;
    foreach($array as $row){
    print "<td><input name='{$i}' class='time' value=''></td>";                
    $k++;
    $i++;
    $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print "";              
    }

  ?>
  </table>
  <table class="table">
  <?php

    $k = 0;
    foreach($array as $row){
    print "<th class='th'>{$j}日</th>";
    $k++;
    $j++;
    $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print "";
    }
    $k = 0;
    foreach($array as $row){
    print "<td><input name='{$i}' class='time' value=''></td>";                
    $k++;
    $i++;
    $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print "";              
    }

  ?>
  </table>
  <table class="table">
  <?php

    $k = 0;
    foreach($array as $row){
    print "<th class='th'>{$j}日</th>";
    $k++;
    $j++;
    $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print "";
    }
    $k = 0;
    foreach($array as $row){
    print "<td><input name='{$i}' class='time' value=''></td>";                
    $k++;
    $i++;
    $k % 7 == 0 && $k !== 0 ? print "<tr></tr>" : print "";              
    }

  ?>
  </table>
  <table class="table">
  <?php
    $l = $i; 
    $l = date('t') - (--$l);

    for($n = 0;$n < $l;$n++){
      print "<th class='th'>{$j}日</th>";
      $k++;
      $j++;
    }

    echo "<tr>";

    for($n = 0;$n < $l;$n++){
    print "<td><input name='{$i}' class='time' value=''></td>";                
    $k++;
    $i++;
    }


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

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

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

投稿 2017/11/20 15:28

編集 2017/11/20 16:11

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/20 15:34

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

    キャンセル

  • 2017/11/20 16:07

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

    キャンセル

  • 2017/11/20 16:12

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

    キャンセル

  • 2017/11/20 16:14

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

    キャンセル

checkベストアンサー

+2

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

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

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

<?php
$days = [
  ["d" => 1],
  ["d" => 2],
  ["d" => 3],
  ["d" => 4],
  ["d" => 5],
  ["d" => 6],
  ["d" => 7],
];
?>
<table>
  <tr>
    <th>月曜</th>
    <th>火曜</th>
    <th>水曜</th>
    <th>木曜</th>
    <th>金曜</th>
    <th>土曜</th>
    <th>日曜</th>
  </tr>
  <tr>
    <?php foreach ($days as $day): ?>
      <td>
        <label><?= $day['d'] ?>日</label>
        <div>
          <input name="shift_at_<?= $day['d'] ?>" />
        </div>
      </td>
    <?php endforeach; ?>
  </tr>
</table>

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

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

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

<?php
$days_by_week = [
  [
    ["d" => 1],
    ["d" => 2],
    ["d" => 3],
    ["d" => 4],
    ["d" => 5],
    ["d" => 6],
    ["d" => 7],
  ],
  [
    ["d" => 8],
    ["d" => 9],
    ["d" => 10],
    ["d" => 11],
    ["d" => 12],
    ["d" => 13],
    ["d" => 14],
  ],
];
?>
<table>
  <tr>
    <th>月曜</th>
    <th>火曜</th>
    <th>水曜</th>
    <th>木曜</th>
    <th>金曜</th>
    <th>土曜</th>
    <th>日曜</th>
  </tr>
  <php foreach ($days_by_week as $days): ?>
    <tr>
      <?php foreach ($days as $day): ?>
        <td>
          <label><?= $day['d'] ?>日</label>
          <div>
            <input name="shift_at_<?= $day['d'] ?>" />
          </div>
        </td>
      <?php endforeach; ?>
    </tr>
  <?php endforeach; ?>
</table>

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

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


まずは座学です。

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

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

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

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

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

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

<?php
$year = 2017;
$month = 12;
$end_of_month = cal_days_in_month(GREGORIAN, $month, $year);

$week = ["日", "月", "火", "水", "木", "金", "土"]; // 単なる参考資料
$dummyDaysList [6, 0, 1, 2, 3, 4, 5];
$datetime = date_create();
date_date_set($datetime, $year, $month, 1);
$w = (int)date_format($datetime, 'w');

$x = [];
for ($i = 0; $i < $dummyDaysList[$w]; $i++) {
  $x[] = ['is_dummy' => true];
}
for ($i = 0; $i < $end_of_month; $i++) {
  $x[] = ['d' => $i + 1, 'is_dummy' => false];
}
$days_by_week = array_chunk($x, 7);

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

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

投稿 2017/11/20 16:05

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/20 16:13

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

    キャンセル

  • 2017/11/20 16:51

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

    キャンセル

+1

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

投稿 2017/11/20 15:23

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/20 15:26

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

    キャンセル

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

ただいまの回答率

91.39%

関連した質問

同じタグがついた質問を見る

  • PHP

    15129questions

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