カレンダーを月曜日から始める(火曜日、水曜日、…から始める)

$time = time();
$start_of_week = 1; // Calendar starts from Monday
$first_day_of_the_week = date('w', strtotime(sprintf('%s-%s-%s', date('Y',$time), date('m',$time), '01')));

$start_of_week = ($start_of_week % 7);
$days = array_merge(array(0), range(1, date("t", $time)));
$start = $first_day_of_the_week - $start_of_week;
if ($start < 0) $start += 7;

$index = array();
if ($start > 0) {
 for ($i = 0; $i < $start; $i++) { $index[] = NULL; }
}
for ($i = 1; $i < count($days); $i++) {
 $index[] = $days[$i];
}
var_dump($index);

カレンダー(七曜表)はたいてい日曜日から始まっていますが、時に月曜日から始めたいこともあります。
しかし、プログラム用のコードを探してもだいたい日曜日からのみです。
では月曜日から始めたい場合どうしたらいいのでしょうか?
1日ずらすだけなのに、けっこう難儀します。

上記のコードは、

  • カレンダーをどの曜日から始めたいか(日曜日=0、月曜日=1、…、土曜日=6)
  • 1日は何曜日か
  • ひと月は何日か

という条件から、カレンダー上の(1日より以前の空白を含めた)日にちの配列が得られます。

今月(2014年8月)、月曜日から始めたい場合だと、

Array
(
    [0] => NULL
    [1] => NULL
    [2] => NULL
    [3] => NULL
    [4] => 1
    [5] => 2
    [6] => 3
    [7] => 4
    [8] => 5
    [9] => 6
    [10] => 7
    [11] => 8
    [12] => 9
    [13] => 10
    [14] => 11
    [15] => 12
    [16] => 13
    [17] => 14
    [18] => 15
    [19] => 16
    [20] => 17
    [21] => 18
    [22] => 19
    [23] => 20
    [24] => 21
    [25] => 22
    [26] => 23
    [27] => 24
    [28] => 25
    [29] => 26
    [30] => 27
    [31] => 28
    [32] => 29
    [33] => 30
    [34] => 31
)

という配列を得られます。
この配列をforなどで回して、7要素ごとに区切って行くと、月曜日から始まるカレンダーの並びを作ることができます。

7要素ごとの区切りを得るには、

$i % 7 == 6 // $iを配列の添字とする

がTRUEになる時を判別します。

おまけ

曜日の並びを月曜(または他の曜日)からに変える

$a = array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT');
$a = array_merge(array_splice($a, $start_of_week), $a)

Leave a Reply