2010-10-20 4 views
0

J'ai commencé à générer un tableau contenant un calendrier de 12 mois à partir de ce (maintenant) mois. C'est pour une application particulière, et nécessite un code spécial, donc je ne peux pas utiliser les bibliothèques de calendrier.Génération du calendrier Échec étrange

Voici le code que j'ai:

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); 

Cela devrait générer un tableau de la forme:

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

Le script affiche le bon nombre de mois, mais pas le nombre exact de jours. .. Le vidage complet est assez long, donc je ne publierai que Octobre, Février et Mars:

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" 
    } 

Maintenant, quel est le problème?

+1

Qu'est-ce que la classe 'fTimestamp' ...? – deceze

+0

Ceci est fourni par le Flourish Unframework: http://flourishlib.com/docs/fTimestamp#Formatting –

Répondre

1

Ne répond directement à votre question, mais je le ferais beaucoup plus simple comme ceci:

$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); 

Pour répondre directement à votre question, vous vous adaptez toujours $then par rapport à lui-même avec un nombre de plus grandes , donc vous sautez des jours et obtenez des nombres funky.

for ($j = 1; $j < $thisMonthDays; $j++) { 
    $then = $then->adjust("+$i days"); 
} 
  1. $then est le 1er, vous ajoutez 1 (première itération)
  2. $then est le 2ème, vous ajoutez 2 (deuxième itération)
  3. $then est le 4ème, vous ajoutez 3
  4. $then est le 7, vous ajoutez 4
  5. etc pp.
+0

Wow, merci. Deux réponses en une. Je n'ai vraiment pas vu cette erreur d'algorithme, bien que maintenant cela semble évident ... mais ça arrive souvent, hein? –

Questions connexes