Генерация календаря странная ошибка - PullRequest
0 голосов
/ 20 октября 2010

Я намеревался создать массив, содержащий 12-месячный календарь, начиная с этого (текущего) месяца.Это для конкретного приложения и требует специального кода, поэтому я не могу использовать библиотеки календаря.

Вот код, который у меня есть:

header('Content-type: text/plain');

$Cal1 = array();

$now = new fTimestamp('now');
$now = $now->modify('Y-m-1 00:00:00');

for ( $i = 0; $i < 12; $i++ ) {
 if ( $i > 1 ) {
  $then = $now->adjust("+$i months");
 }
 elseif ( $i == 1 ) {
  $then = $now->adjust("+1 month");
 }
 else {
  $then = $now;
 }
 $thisMonth = $then->format('F');
 $Cal1[$thisMonth] = array();
 $thisMonthDays = $then->format('t');
 for ( $j = 0; $j < $thisMonthDays; $j++ ) {
  if ( $i > 1 ) {
   $then = $then->adjust("+$i days");
  }
  elseif ( $i == 1 ) {
   $then = $then->adjust("+1 day");
  }
  $thisDate = $then->format('j');
  $thisDay = $then->format('l');
  $Cal1[$thisMonth][$thisDate] = $thisDay;
 }
}

var_dump($Cal1);

Это должно сгенерировать массив в форме:

array {
    ["Month_Name"] => array {
        [Day_Number] => "Day_Name"
        etc...
    }
    etc...
}

Скрипт выводит правильное количество месяцев, но не правильное количество дней ... Полный дамп довольно длинный, поэтому я буду публиковать только октябрь, февраль и март:

array(12) {
  ["October"]=>
  array(1) {
    [1]=>
    string(6) "Friday"
  }
  ["February"]=>
  array(22) {
    [5]=>
    string(8) "Saturday"
    [9]=>
    string(9) "Wednesday"
    [13]=>
    string(6) "Sunday"
    [17]=>
    string(8) "Thursday"
    [21]=>
    string(6) "Monday"
    [25]=>
    string(6) "Friday"
    [1]=>
    string(7) "Tuesday"
    [29]=>
    string(7) "Tuesday"
    [2]=>
    string(8) "Saturday"
    [6]=>
    string(9) "Wednesday"
    [10]=>
    string(6) "Sunday"
    [14]=>
    string(8) "Thursday"
    [18]=>
    string(6) "Monday"
    [22]=>
    string(6) "Friday"
    [26]=>
    string(7) "Tuesday"
    [30]=>
    string(8) "Saturday"
    [4]=>
    string(9) "Wednesday"
    [8]=>
    string(6) "Sunday"
    [12]=>
    string(8) "Thursday"
    [16]=>
    string(6) "Monday"
    [20]=>
    string(6) "Friday"
    [24]=>
    string(7) "Tuesday"
  }
  ["March"]=>
  array(19) {
    [6]=>
    string(6) "Sunday"
    [11]=>
    string(6) "Friday"
    [16]=>
    string(9) "Wednesday"
    [21]=>
    string(6) "Monday"
    [26]=>
    string(8) "Saturday"
    [31]=>
    string(8) "Thursday"
    [5]=>
    string(8) "Thursday"
    [10]=>
    string(7) "Tuesday"
    [15]=>
    string(6) "Sunday"
    [20]=>
    string(6) "Friday"
    [25]=>
    string(9) "Wednesday"
    [30]=>
    string(6) "Monday"
    [4]=>
    string(6) "Monday"
    [9]=>
    string(8) "Saturday"
    [14]=>
    string(8) "Thursday"
    [19]=>
    string(7) "Tuesday"
    [24]=>
    string(6) "Sunday"
    [29]=>
    string(6) "Friday"
    [3]=>
    string(9) "Wednesday"
  }

Теперь, в чем дело?

1 Ответ

1 голос
/ 20 октября 2010

Непосредственно не отвечает на ваш вопрос, но я бы сделал это намного проще, например так:

$cursor = mktime(0, 0, 0, date('m'), 1);
$end = strtotime('+1 year', $cursor);

$out = array();

while ($cursor < $end) {
    $out[date('F', $cursor)][date('j', $cursor)] = date('l', $cursor);
    $cursor = strtotime('+1 day', $cursor);
}

var_dump($out);

Чтобы напрямую ответить на ваш вопрос, вы всегда корректируете $then относительно себя с помощьювсе большие числа, следовательно, вы пропускаете дни и получаете забавные числа.

 for ( $j = 1; $j < $thisMonthDays; $j++ ) {
     $then = $then->adjust("+$i days");
 }
  1. $then - 1-й, вы добавляете 1 (первая итерация)
  2. $then является вторым, вы добавляете 2 (вторая итерация)
  3. $then является четвертым, вы добавляете 3
  4. $then является седьмым, вы добавляете 4
  5. и т. п.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...