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

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

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

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

Q&A

解決済

6回答

2096閲覧

一年分の日曜日の取得

leoairen

総合スコア122

PHP

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

0グッド

0クリップ

投稿2016/07/01 05:04

一年分の日曜日の取得について下記のように書いてみましたが、行き詰まっております。
配列として年が変わるたびに日曜日を取得したいのですが、どう修正すればよいかどなたか教えて頂けますでしょうか。

$kokuminy = date('Y'); $kokuminm = date('n'); $kokumind = 1; while (checkdate($kokuminm, $kokumind, $kokuminy)) { if(date("w", mktime(0, 0, 0, $kokuminm, $kokumind, $kokuminy)) == 0){ echo $kokuminnichiyou; } $kokumind++; }

それぞれのvar_dumpの結果は以下の通りになります。

var_dump($kokuminy); string(4) "2016" var_dump($kokuminm); string(1) "7" var_dump($kokumind); int(32) var_dump($kokuminnichiyou); NULL

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

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

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

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

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

guest

回答6

0

ベストアンサー

まずそのやり方ですと、2016年の7月からスタートし、31日までしかチェックされません。
$kokumindが32になったときにcheckdateがfalseを返し、ループを抜けます。

あなたの求める「その年の全ての日曜日」を求めるなら、そもそもdate("n")で現在の月から始めることが間違いですし、checkdateでループしているのが日だけなので月が変わった時点で終わります。

PHPにはDateTimeという型があり、日付を管理する機能を持っています。それを活用したコードがこちらになります。

PHP

1<?php 2$currentYear = date("Y"); 3$date = new DateTime($currentYear."/01/01"); // 該当年度の1月1日を作る 4while(($date->format("Y") == $currentYear)) { // 年が変わるまで続ける 5 if($date->format("w") == 0) { // 曜日が0(日曜日) 6 echo $date->format("Y-m-d") . "<br>"; // 該当の日付を出力 7 } 8 $date->modify("+1 day"); // 1日進める 9} 10?>

投稿2016/07/01 05:30

masaya_ohashi

総合スコア9206

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

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

leoairen

2016/07/01 07:20

ご回答、ありがとうございます。できました。ご解説も大変丁寧でわかりやすかったです。ありがとうございました。
guest

0

敢えて、今の記述のまま書くならこんな感じになるかな?とりあえず、月ごとのループはできてるので、これに年ごとのループを組み合わせます。

<?php $kokuminy = date('Y'); $kokumind = 1; $sundayAr = array(); for($kokuminm = 1 ;$kokuminm < 13 ; $kokuminm++){ while (checkdate($kokuminm, $kokumind, $kokuminy)) { if(date("w", mktime(0, 0, 0, $kokuminm, $kokumind, $kokuminy)) == 0){ array_push( $sundayAr,date("y/m/d",strtotime("$kokuminy-$kokuminm-$kokumind"))); } $kokumind++; } $kokumind = 1; } var_dump($sundayAr); ?>

投稿2016/07/01 05:51

FKM

総合スコア3608

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

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

leoairen

2016/07/01 07:17

ご回答、ありがとうございます。できました。ありがとうございました。
guest

0

最初の日曜から7日ずつ数えたほうがよくないですか?

PHP

1<?PHP 2$y = date('Y'); 3$w=date('w',mktime(0,0,0,1,1,$y)); 4$i=0; 5while (date('Y',($d=mktime(0,0,0,1,1+$i+(7-$w)%7,$y)))==$y) { 6 print date("Ymd",$d)."<br>"; 7 $i+=7; 8} 9

投稿2016/07/01 05:48

yambejp

総合スコア114583

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

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

leoairen

2016/07/01 07:17

ご回答、ありがとうございます。できました。ありがとうございました。
guest

0

DateTime クラス使うといいと思いますよ。

PHP

1$base = new DateTime(); 2$end = new DateTime($base->format('Y-01-01')); 3$end->add(new DateInterval('P1Y')); 4for ($dt = new DateTime($base->format('Y-01-01')); $dt < $end; $dt->add(new DateInterval('P1D'))) { 5 if ($dt->format('w') == 0) { 6 echo $dt->format('Y-m-d'); 7 } 8}

投稿2016/07/01 05:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

leoairen

2016/07/01 07:17

ご回答、ありがとうございます。できました。ありがとうございました。
guest

0

PHPはかけないけどパズルみたいで面白そうなので参加。
思いついたアプローチだけでも書いてみよう。

誰も見てないだろうけど、せっかくなので調べてコードにしてみました。
1年の日曜日の数が間違ってたのをこっそり修正

とりあえず動いたけど、ifとかforのスコープ内で作った変数って外で使っていいのかな?

PHP

1<?php 2// 1月1日の曜日を求める 3// 曜日 = 0:日曜日~6:土曜日 4$year = 2016; 5$week = date("w", mktime(0, 0, 0, 1, 1, $year)); 6 7// 1年間の日曜日の数 8// うるう年だと1/1が日曜か土曜日だと53回、それ以外は52回 9// 平年だと1/1が日曜だと53回、それ以外は52回 10if (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)) { 11 $weeks = [53, 52, 52, 52, 52, 52, 53]; 12} else { 13 $weeks = [53, 52, 52, 52, 52, 52, 52]; 14} 15$sundayTimes = $weeks[$week]; 16 17// 年の最初の日曜日は何日目か 18$firstSunday = [1, 7, 6, 5, 4, 3, 2]; 19// 年の最初の日曜日から(1年間の日曜日の数 - 1)回、7日を足す 20$sunday = mktime(0, 0, 0, 1, $firstSunday[$week], $year); 21for ($idx = 0; $idx < $sundayTimes; $idx++) { 22 // とりあえず配列に入れておく 23 $sundays[$idx] = date("y-m-d", $sunday); 24 $sunday += 604800; // 7日 * 24時間 * 60分 * 60秒 25} 26 27// この関数なに?デバッグ用? 28var_dump($sundays); 29?>

投稿2016/07/01 06:11

編集2016/07/01 10:19
kopio

総合スコア487

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

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

leoairen

2016/07/01 07:18

ご回答、ありがとうございます。自分も初心者ですので、どなたか書いていただけると勉強になります。
guest

0

処理効率を追求しなければこんな感じで。

PHP

1$YEAR=2016; 2 3for($day=mktime(0,0,0,1,1,$YEAR); date("Y",$day)==$YEAR; $day+=24*60*60){ 4 if(date("w",$day)==0){ 5 ~~~ 6 } 7}

処理効率を追求するなら、まず年の最初の日曜日のタイムスタンプを求めて、そこから+=7*24*60*60するのでしょうが、分かりにくくなります。

投稿2016/07/01 05:55

otn

総合スコア84423

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

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

leoairen

2016/07/01 07:19 編集

ご回答、ありがとうございます。できました。ありがとうございました。処理効率というのは読み込むときのサーバーへの負担が少なく、早いなどといったことでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問