phpで特定の日付からある日数分前の日付一覧を取得する

PHPである特定の日から1周間前までの日付一覧を取得する必要があった。
そこでこんな関数を作ってみた。
引数は基準日の各要素と取ってくる機関の長さ。
うるう年も考慮している。
計算方法はここを参照。1行で書けるうるう年判別法 - プログラマはサイコロを振らない

private function getDay($year = NULL, $month = NULL, $day = NULL, $length = NULL) {
                if ($year == NULL) {
                        $year = date('Y');
                }
                if ($month == NULL) {
                        $month = date('m');
                }
                if ($day == NULL) {
                        $day = date('d');
                }
                if ($length == NULL){
                        $length = 6;
                }
                if ($day >= '07'){
                        $dayList =  array('year' => $year,
                                'month' => $month,
                                'day' => range($day - $length, $day),
                        );
                }
                else {
                        if ($month != '1') {
                                $dayList = array('year' => $year,
                                        'month' => array(
                                                $month - 1,
                                                $month,
                                        ),
                                        'day' => range($day - $lenght, $day),
                                );
                        }
                        else {
                                $dayList =  array(
                                        'year' => array(
                                                $year - 1,
                                                $year,
                                        ),
                                        'month' => array(
                                                12,
                                                1,
                                        ),
                                        'day' => range($day - $length, $day),
                                );
                        }
                        for ($i = $length; $i >= 0; $i--) {
                                if ($dayList['day'][$i] == 0) {
                                        switch($dayList['month'][0]){
                                        case 4:
                                        case 6:
                                        case 9:
                                        case 11:
                                                $dayList['day'][$i] = 30;
                                                break;
                                        case 2:
                                                $dayList['day'][$i] = 28 + (1 / ($dayList['year'][0] % 4 + 1)) * (1 - 1 / ($dayList['year'][0] % 100 + 1)) + (1 / ($dayList['year'][0] % 400 + 1));
                                                break;
                                        default:
                                                $dayList['day'][$i] = 31;
                                        }
                                }
                                else if ($dayList['day'][$i] < 0) {
                                        $dayList['day'][$i] = $dayList['day'][$i + 1] -1;
                                }
                        }
                }
                return $dayList;
        }

結果はこんな感じ。

getDay();
Array
(
    [year] => 2013
    [month] => 10
    [day] => Array
        (
            [0] => 24
            [1] => 25
            [2] => 26
            [3] => 27
            [4] => 28
            [5] => 29
            [6] => 30
        )

)

getDay(null, 1, 4, null);
Array
(
    [year] => Array
        (
            [0] => 2012
            [1] => 2013
        )

    [month] => Array
        (
            [0] => 12
            [1] => 1
        )

    [day] => Array
        (
            [0] => 25
            [1] => 26
            [2] => 27
            [3] => 28
            [4] => 29
            [5] => 30
            [6] => 31
            [7] => 1
            [8] => 2
            [9] => 3
            [10] => 4
        )

)

ただ関数の名前とか返り値は微妙かもしれない。。。
なので呼んだ側でうまく使ってやる必要がある。