[php]1/1?12/31を出力するには?

php

ふと、「1/1?12/31までの365日を出力する」には、phpならどういうプログラムになるかが気になった。いくつか書いてみたので、皆さんだったら、何番を使うかをコメントしてもらえるとうれしいです。

1.配列を用いた、すぐに思いつきそうな奴

予め配列に各月の日数を突っ込んでおいて、回す方法。たぶん、多くの人が一番最初に思いつくのがこれだと思うのですが、どうなんでしょう?


<?php
/**
* 1月1日?12月31日を出力するサンプル1
*/
$month_days = array(1=>31,28,31,30,31,30,31,31,30,31,30,31);
for (
$i = 1; $i <= 12; $i++) {
for(
$j = 1; $j <= $month_days[$i]; $j++) {
printf("%d月%d日 / ", $i, $j);
}
}
?>

2-1.配列を用いずに、各月の日数を求める方法、その1

phpに慣れている人なら、配列にいれなくても、date('t')で指定の月の日数を取得できることを知っているかもしれません。


<?php
/**
* 1月1日?12月31日を出力するサンプル2-1
*/
for ($i = 1; $i <= 12; $i++) {
// その月の日数を求める date('t')
$days = date('t', mktime(0,0,0,$i,1,2001));
for(
$j = 1; $j <= $days; $j++) {
printf("%d月%d日 / ", $i, $j);
}
}
?>

2-2.配列を用いずに、各月の日数を求める方法、その2

phpには、date('t')以外にも指定の月の日数を取得できる関数があります。カレンダーモジュールのcal_days_in_month()関数です。Windows版には標準で組み込まれているそうですが、Linuxだと--enable-calendarが必要かもしれません。


<?php
/**
* 1月1日?12月31日を出力するサンプル2-2
*
* using Calendar module (Windows版では標準でサポート)
*/
for ($i = 1; $i <= 12; $i++) {
// その月の日数を求める cal_days_in_month
$days = cal_days_in_month(CAL_GREGORIAN, $i, 2001);
for(
$j = 1; $j <= $days; $j++) {
printf("%d月%d日 / ", $i, $j);
}
}
?>

3.1重for文なやつ

たまたま思いついたのですが、1重for文でも同じ処理ができそうです。strtotime('+1 day')がポイントです。処理はほかのに比べると重いような気もしますが、1重for文しか使えない状況(どんな状況だww)では役に立ちます。


<?php
/**
* 1月1日?12月31日を出力するサンプル3
*/
$date1 = mktime(0,0,0,1,1,2001);
for (
$i = 0; $i < 365; $i++) {
echo
date('n月j日 / ', $date1);
$date1 = strtotime('+1 day', $date1);
}
?>

4.PEAR::Calendarでかっこよく?

PEARのCalendarライブラリを使うとオブジェクト指向な感じ(?)に仕上がります。今回は表形式のいわゆるカレンダーを作るわけではないので、ちょっとコード量が多くなってしまう気がしますが、本来は表形式のカレンダーを作るときに役に立つライブラリです。


<?php
/**
* 1月1日?12月31日を出力するサンプル4
*
* using PEAR::Calendar-0.5.3(beta)
*/
require_once 'Calendar/Year.php';
$year = new Calendar_Year(2001);
$year->build();
while (
$month = $year->fetch()) {
$month->build();
while (
$day = $month->fetch()) {
printf("%d月%d日 / ", $day->thisMonth(), $day->thisDay());
}
}
?>

しっくりくるプログラムありましたか?「俺だったらこう書く!」とか「もっとスマートに書けるぜ」みたいな人が居ましたら、是非ともコメントして欲しいです。

About: uechoco


5 thoughts on “[php]1/1?12/31を出力するには?”

  1. [datetime][zend framework]言われたのでZend_Dateで試しにやってみた。

    なんか あと選択肢は Zend_Date かなぁ。だれか書いてトラバ(ry Twitter / uechoco: あと選択肢は Zend_Date かな…

Comments are closed.