ギークなお姉さんは好きですか

恋焦がれる理想の男性・ギークに近づくため、プログラミングがわかるお姉さんを目指すブログ

9日目 カレンダを作ルンダ♪

日記

あけましておめでとうございますー!


  


書初めを写メでうpって、アナログとハイテクのコラボレーションって感じでなんかいいよね!
アナログとハイテクはもっと仲良くすればいい。

大晦日&元旦は、田口さんいとまささんけんすう$dropdbさん・劇団ブサイコロジカル
女優さんたちと、田口さんちで年越し&初詣。
おみくじ引いたら吉だったけど、吉のわりにはすごくいいことたくさん書いてあったので超満足♪


  


2007年はdanちゃんちにお邪魔したりひろゆきさんと朝まで飲めたりして、分不相応なくらいに
幸せな出来事がいっぱいあった。
先月は師走ってて後半更新が滞ったけど、きっとRSSリーダーで読んでる人が多いだろうし、
更新しなければしてないことはバレないんじゃ・・・なんてナンセンスなことを考えていた。
この考えはおそらく一理ある。
がっ。
一理あることが正しい行為とは限らない。
2008年も頑張ろう頑張ろう!みんなに素敵な出来事がたくさんたくさん訪れることを祈って。
本年もどうぞ宜しくお願いしますっ┏○"





カレンダを作ルンダ!

タイミング的に、カレンダを作りたいのでカレンダを作ルンダ。
昨日西武に行った時もたくさん売ってたし。
きっと今が旬。
旬に乗ルンダ。

んじゃ、ソース貼ルンダ。
(←そろそろ飽きてきた)
※タグの最初は全角にしてあります。

あっ、前回コメントくださった Theoria Laevatain さん、ありがとうございました!
コンバータ改造したいです!今年の目標のひとつにするぞっ。



1 <?php
2  $today_year =date("Y");
3  $today_month =date("n");
4 $current=mktime(0,0,0,$today_month,1,$today_year);
5 $first_day=date("w",$current);
6 $last_day=date("t",$current);
7 ?>
8 <html>
9 <head>
10 <title>カレンダー</title>
11 </head>
12 <body>
13 <h1 style="background:#cccccc">
14 <?php print(date("Y年m月",$current)); ?>
15 のカレンダー</h1>
16 <table border="1" width="300">
17 <tr>
18 <td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td>
19 </tr>
20 <?php
21  for($i=1;$i<=$first_day+$last_day;$i++){
22   if($i%7==1){print("<tr>");}
23   if($i>$first_day){
24    print("<td>".($i-$first_day)."</td>");
25   }else{
26    print("<td> </td>");
27   }
28   if($i%7==0){print("</tr>");}
29   }
30 ?>
31 </table>
32 </body>
33 </html>

サンプル:carendar.php



Σ目がっ・・・目がぁあああーーーっ!!!
なにこのバルスコード。
目がぶっ壊れルンダ><
これは堂本剛じゃなくても正直しんどい。
わりとギブめ。
でもがんばルンダ!(←クセになってきた)


2行目。
変数 $today_yeardate("Y") を代入。
さて。
date とは何ぞ?


date - ローカルの日付/時刻を書式化する

参考:PHP: date - Manual


↑のページを下にスクロール。


Y 年。
4 桁の数字。
例: 1999または2003
n 月。
数字。
先頭にゼロをつけない。
1 から 12



つまり、date("Y") でローカルで記録されてる西暦、今だったら2008を取得して、
それを $today_year に代入するってことね。
じゃあ $today_month も同じ理屈だ。
これは date("n") だから月、今だったら1を取得して $today_month に代入、っと。
ココまではいい。
ココからがちょっとややこしくなってくルンd(←そろそろ自重)



4行目。
mktime って何?


mktime関数はタイムスタンプを取得します。
取得したタイムスタンプは、date関数やgetdateなど、タイムスタンプを
パラメータとして受け取る関数で使われます。
パラメータは下位の要素から省略可能です。
たとえば、「年、月、日」をまとめて省略することはできますが、
最初のパラメータ「時」を省略して「分、秒」を指定することはできません。

参考:PHP辞典 (Desktop reference)



この関数は直感的に分かり難いんだけど、上記の参考書の説明が紅は一番分かり易かった。
長くなるので引用はしないけど、文例が GJ なのだ。
たぶん、mktime 関数ってのは年表が読める子なんだと思う。



5行目。
また date が出てきた。
上で引用したページをもう1回見てみる。


説明
string date ( string $format [, int $timestamp ] )
指定された引数 timestamp を、与えられた フォーマット文字列によりフォーマットし、
日付文字列を返します。
タイムスタンプが与えられない場合は、現在の時刻が使われます。

つまり timestamp はオプションであり そのデフォルト値は time() の値です。


w 曜日。
数値。
0 (日曜)から 6 (土曜)
t 指定した月の日数。
28 から 31



ふむん。
5行目は w$current で今の月、つまりアクセスした月の最初の曜日を$first_day に代入。
6行目も同じく、その月の日数=最後の日付。
つまり31日まである月だったら31を$last_day に代入と。



はぁ・・・息苦しい・・・。
日本語でおk、と言いたいけど言えないのがつらい。
我慢する。
8〜13行目までは html なので飛ばす。


14行目。
(date("Y年m月",$current))print せよ、だそうな。
これは上と同じだよね。
date で今の年月日を取得して、それを出力せよって意味だ。


15〜19行目まで html。
飛ばす。


21行目。
for が出てきた。
前回やった。
繰り返し構文。
参考:8日目 目指せ!ループマスターへの道!


まずは初期化。
$i に 1 を代入。
次に終了条件。
$i$first_day$last_day を足した値より小さいうちは繰り返しを続ける。
言い換えると、この条件が成り立たなくなったら繰り返しが終わる。
増分式は $i++
繰り返すごとに $i に 1 を足していく。
ココが非常に分かりにくい。
ええとね、$first_day ってのは最初の曜日の数字が入る、って言ってたよね。
たとえば、1月は最初の曜日が火曜日だから、ココに2が入るのね。
で、$last_day は最後の日付だから31が入る。
2+31=33。
$i は1だから、1よりは大きい。
なので、$i<=$first_day+$last_day はまだ成り立つ。
ループを重ねるごとにどんどん $i に1を足していって、この処理を延々と繰り返す。
いつ終わるかというと、$i が33になったとき。


その間、どんな処理を繰り返すかというのは22行目以降。
もし $i%7==1 だったら <tr> を出力せよ、と言ってる。
% は算術演算子っていうんだって。


算術演算子
加減乗除とは、最も基本的で簡単な足し算や引き算、掛け算、割り算を行う演算子です。

% 剰余 17 % 5 割り算したときの割り切れなかった数を求める

参考:演算子/PHP入門


$i を7で割って、余りが超イコールで1だったら、ってことか。
具体的にはなんだ。
$i が8とか15のときは余りが1になるから、そのときは <tr> を出力か。


 



23〜24行目。
もし $i$first_day より大きいときは、("<td>".($i-$first_day)."</td>") を出力せよ、と。
うーーーん。
1月の場合、$first_day は2だから、$i が3以上のときは(カッコ)内を出力、ってことらしい。
出力する内容は、$i から $first_day を引いた数値が入ったtd。


- 減算 17 - 5 2つ以上の値の引き算を行う



ピリオドは文字列を連結させるそうな。


$str = "土中" . "モグラ";
↑文字列を連結させるには(.)を使います
"土中"と"モグラ"が結合されて$strに代入されます

参考:もぐりん PHPのお勉強->演算子



なので、$i が3のときはそこから2を引いた数、つまり1というセルが出力される。


 


おおおおお!先ほどからひそかにじわじわ感じていたが!!理解できた気がするううう!!!


25〜26行目。
そうじゃなかったら、$i$first_day より小さかったら ("<td> </td>") を出力せよ。
&nbsp というのは空白のこと。
だから、数字が入ってない空のセルを出力してね、と言ってる。


 



28行目。
もし $i を7で割った余りが超イコールで0だったら。
つまり7で割り切れたら。
</tr>だから、行を閉じろと言ってる。
これにて終了。
はぁ。
ちかれた・・・。



まとめよう。
カレンダーなので、1月40日とか50日まで処理を繰り返されては困る。
だから、どこで終わるかを21行目で指定した。
一週間は7日なので、土曜まで進んだら新しい列を追加したい。
それを22行目で指示。
23行目の $i>$first_day というのは、最初の曜日より前のセル、今月の場合だと
日・月に数字は入れないから、それ以降だったら日付を入れろ、と条件式で指示してる。
だって前のセルって先月だからね。
本来なら12月31日が入るべき場所だから、
そこには空白を入れろと言ってる。


28行目は一週間が終わったら列を閉じろと。
余りが3とか4のときは列を追加しない。
だってまだ水曜とか木曜なのに来週になっちゃうとか困るっしょ。
だから <tr> とか追加しない。話のわかるヤツだ。if ヤバイ。超がんばれ。





わぁー!できたできた!カレンダーだカレンダーだ!!すごいすごい!!
みんなコレをホームにしたらいいんじゃないかな!?だって便利だもんね!紅はしないけど!!


元旦からかなり疲れた。
頑張った自分(笑)を褒めてあげたい。
途中で寝落ちしたのはバレていないはず.....|д・*)