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

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

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

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

Q&A

解決済

3回答

3087閲覧

PHP 選択された年数分の日付を曜日付きで出力したい

hiro0208

総合スコア75

PHP

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

0グッド

0クリップ

投稿2017/04/04 04:46

表題の通り日付と曜日を出力するんですが、「選択された年数分」のところが、もっとシンプルな記述にならないか考えています。

1年は365日か366日だということを踏まえてロジックを書くことはできないでしょうか?

php

1<!doctype html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>samaple</title> 6</head> 7<body> 8<?php 9//曜日の配列を作成する 10$array_week = array('日', '月', '火', '水', '木', '金', '土'); 11//現在の年 12$from = date('y'); 13//プルダウンの選択値 14for ($i = 1; $i <= 5; $i++) { 15 $option_year .= '<option value="' . $i . '">' . $i . '</option>' . "\n"; 16} 17?> 18<form action="" method="post"> 19<select name="years"> 20<?php echo $option_year ?> 21</select>年分 22<input type="submit" name="btn" value="送信"> 23</form> 24<?php 25if (isset($_POST['btn'])) { 26 $years = $_POST['years']; 27 //1年間*入力値の日数を取得 28 for ($i = 1; $i <= 12; $i++) { 29 //選択値の分ループ 30 for ($j = 0; $j < $years; $j++) { 31 //1年の日数と選択値に合わせタイムスタンプを取得 32 $timestamp = mktime(0, 0, 0, $i, 1, date('Y') + $j); 33 //日付を取得していく 34 $days += date('t', $timestamp); 35 } 36 } 37 echo '<table border="1">' . "\n"; 38 //取得日付まで繰り返す 39 for ($i = 0; $i < $days; $i++) { 40 //今年の1月1日のタイムスタンプ取得 41 $first = mktime(0, 0, 0, 1, 1 + $i, $from); 42 //日付を取得 43 $date = date('Y/m/d', $first); 44 //1月1日の曜日を取得 45 $week = date('w', $first); 46 echo '<tr>' . "\n" 47 . '<td>' . $date . '</td>' . "\n" 48 . '<td>' . $array_week[$week] . '</td>' . "\n" 49 . '</tr>' . "\n"; 50 } 51 echo '</table>' . "\n"; 52} 53?> 54</body> 55</html> 56コード

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

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

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

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

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

guest

回答3

0

ベストアンサー

自分ならむしろ365日とか366日を意識しなくても良い作りにします。
if (isset($_POST['btn'])) {の中を書き換えてみました。

PHP

1 $years = $_POST['years']; 2 3 echo '<table border="1">' . "\n"; 4 5 //今年の1月1日のタイムスタンプ取得 6 $first = mktime(0, 0, 0, 1, 1, $from); 7 8 // 無限ループ 9 for (;;) { 10 // 選択された年数を超えたらループを抜ける 11 $year = date('y', $first); 12 if ($year >= $from + $_POST['years']) break; 13 14 // 日付・曜日を出力 15 $date = date('Y/m/d', $first); 16 $week = date('w', $first); 17 echo '<tr>' . "\n" 18 . '<td>' . $date . '</td>' . "\n" 19 . '<td>' . $array_week[$week] . '</td>' . "\n" 20 . '</tr>' . "\n"; 21 22 // 1日加算 23 $first = $first + 60 * 60 * 24; 24 } 25 echo '</table>' . "\n";

質問のコードを流用して書き換えているので、$firstなど変数名がふさわしくないのはご了承ください。

投稿2017/04/04 05:14

ttyp03

総合スコア16996

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

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

0

Datetimeクラスを使えばもっと単純に書ける気がします。
質問文のソースコードの</form>から</body>の間のコードを入れ替えてみてください。

PHP

1<?php 2if (isset($_POST['btn'])) { 3 //最大の1月1日でDatetimeをインスタンス化 4 $maxDate = new Datetime(((int)date('y') + $_POST['years']).'-1-1'); 5 6 echo '<table border="1">' . "\n"; 7 //最大日(n年後の1月1日)になったらループを抜ける 8 for($date = new Datetime(date('y').'-1-1'); $date < $maxDate; $date->modify('+1 days')) { 9 echo '<tr>' . "\n" 10 . '<td>' . $date->format('Y-m-d') . '</td>' . "\n" 11 . '<td>' . $array_week[$date->format('w')] . '</td>' . "\n" 12 . '</tr>' . "\n"; 13 } 14 15 echo '</table>' . "\n"; 16} 17?>

投稿2017/04/04 05:15

編集2017/04/04 05:52
kunai

総合スコア5405

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

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

0

年数、月数でループして、対象年月の日数が取得できれば1年の日数は意識する必要はなくなると思います。
date()関数を使ってdate('t', $timestamp)とすれば、$timestampで指定した年月の日数が取得できます。
その日数分ループすれば、年月日での三重ループにより同様の処理ができるはずです。

PHP

1if (isset($_POST['btn'])) { 2 $years = $_POST['years']; 3 4 $startY = date('Y'); 5 echo '<table border="1">' . "\n"; 6 // 指定年数分のループ 7 for ($y = $startY; $y < $startY + $years; $y++) { 8 // 月数分のループ 9 for ($m = 1; $m <= 12; $m++) { 10 // 対象年月の日数を取得 11 $days = date('t', strtotime("{$y}-{$m}-1")); 12 // 日数分のループ 13 for ($d = 1; $d <= $days; $d++) { 14 $timestamp = mktime(0, 0, 0, $m, $d, $y); 15 $date = date('Y/m/d', $timestamp); 16 $week = date('w', $timestamp); 17 echo '<tr>' . "\n" 18 . '<td>' . $date . '</td>' . "\n" 19 . '<td>' . $array_week[$week] . '</td>' . "\n" 20 . '</tr>' . "\n"; 21 } 22 } 23 } 24 echo '</table>' . "\n"; 25} 26

投稿2017/04/07 14:10

sleepsheep

総合スコア310

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問