回答編集履歴

2

加筆

2021/02/06 05:49

投稿

退会済みユーザー
test CHANGED
@@ -63,3 +63,65 @@
63
63
  「created BETWEEN DATE(:gessho) AND DATE(:getsumatsu)」
64
64
 
65
65
  みたいにしてこれもbindValue()で与えればいいわけで。
66
+
67
+
68
+
69
+ ---
70
+
71
+
72
+
73
+ もう一つ。
74
+
75
+ 構造の話になってくるのですが、
76
+
77
+ 質問者さんは二次元配列(週単位の配列)を組んで実装していますが、
78
+
79
+ 日曜日から週を始めるためには二次元配列を組まなくてもいい方法があります。
80
+
81
+
82
+
83
+ 日付を管理する配列だけのシンプルさにして、
84
+
85
+ 曜日を判定して土曜日であればtr要素を出力して週を改めるってだけで実現できます。
86
+
87
+ 日付は常に+1方向で増えていくだけなので、単純な一つのfor()ループだけです。
88
+
89
+ その日付のデータを出力する前や後に、曜日の判定処理を加えるのです。
90
+
91
+
92
+
93
+ tr出力
94
+
95
+
96
+
97
+ 当月1日の曜日ギャップを調整するfor()ループでtd出力
98
+
99
+
100
+
101
+ 曜日ごとデータ出力for()ループ開始
102
+
103
+
104
+
105
+ その日付データを出力(曜日ごとの色替えや今日の色替えなどもここで)
106
+
107
+
108
+
109
+ もしも土曜日ならtr出力して週を改める
110
+
111
+
112
+
113
+ ループ終了、繰り返し。
114
+
115
+
116
+
117
+ 末日以降の曜日ギャップを調整するfor()ループでtd出力
118
+
119
+
120
+
121
+ 忘れずに閉じtr出力して終了
122
+
123
+
124
+
125
+ という流れで、組めるはず。
126
+
127
+ 曜日の繰り返しなんてしなくても組めます。

1

見直し

2021/02/06 05:49

投稿

退会済みユーザー
test CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  これ、一度にできますよね。
4
4
 
5
- それに、もしもデータが複数年に渡った場合に全部のデータを抽出すると邪魔なので、
5
+ それに、もしもデータが当月分だけじゃなく複数に渡った場合に全部のデータを抽出すると邪魔なので、
6
6
 
7
- 一ヶ月分のカレンダーを作ろうとしているように見えたので、念の為にcreatedを`$year`と`$month`で区切ってみるのも加えてみたり。
7
+ 一ヶ月分のカレンダーを作ろうとしているのであれば、念の為にcreatedを`$year`と`$month`で区切ってみるのも加えてみたり。
8
8
 
9
9
  それに、ORDER BY句がないので、抽出される順序が不定になってるので補ってみたり。
10
10
 
@@ -45,3 +45,21 @@
45
45
  MySQL前提でDAYOFMONTH()を使いましたが、1日目がゼロではじまるため、+1しています。
46
46
 
47
47
  MySQL 5.6のマニュアルでは→[12.7 日付および時間関数](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html)
48
+
49
+
50
+
51
+ なお、安直に「year(created) = :year and month(created) = :month」とした箇所は、
52
+
53
+ いちいち関数による演算を加えると遅くなる傾向にあるため、
54
+
55
+ より負担なく高速にするためには
56
+
57
+ 当月の初日の文字列と最終日の文字列を用意してBETWEENするのが良いかと。
58
+
59
+ 「created BETWEEN DATE('2021-02-01') AND DATE('2021-02-28')」
60
+
61
+ になるように
62
+
63
+ 「created BETWEEN DATE(:gessho) AND DATE(:getsumatsu)」
64
+
65
+ みたいにしてこれもbindValue()で与えればいいわけで。