Costruzione calendario

emanuelevt

Utente Attivo
24 Giu 2009
298
0
0
Allora ragazzi vorrei ottenere un array in cui a ogni giorno del mese corrisponde un giorno della settimana (una volta ottenuto questo lo inserirò in una tabella per ottenere il calendario);

il codice da mefatto è questo:

Codice:
<?php

/*ottengo le variabili*/

$data=getdate();
$gmese=$data['mday'];
$gsett=$data['wday'];
$mese=4;

/*comincio a costruire l'array ($array) portandolo all'inizio
che contiene le corrispondenze tra giorno del 
mese e giorno numerico della settimana*/
echo'<h1>azzerramento array</h1><br />';
while($gmese>0){
$array[$gmese--]=$gsett--;
if($gsett<0)$gsett=6;
echo 'Giorno del mese: '. $gmese .' <br />';
echo 'Giorno della settimana: '. $gsett .'<hr>';
}

/*Vedo quale sia l'ultimo giorno del mese*/
if(checkdate($mese,28,$data['year']))$last=28;
if(checkdate($mese,29,$data['year']))$last=29;
if(checkdate($mese,30,$data['year']))$last=30;
if(checkdate($mese,31,$data['year']))$last=31;

echo '<br /><h1>Array completo</h1><br /> ';

while($gmese<$last){

$array[$gmese++]=$gsett++;
if($gsett>6)$gsett=0;
echo 'Giorno del mese: '. $gmese .' <br />';
echo 'Giorno della settimana: '. $gsett .'<hr>';
}

l'array funziona o apparentemente funziona; infatti se vado a visualizzare al primo giorno del mese, corrisponde il giorno della settimana 4(gio) e alla fine del mese quindi $array[30] corrisponde il girono5 (ven);

Però come mai quando vado ad incrementare il mese si sballa?
cioè se vado ad impostare $mese=5 , ovvero a maggio; al numero 1 del mese mi fa corrispondere sempre un giov anziché un sab; quindi il numero 6...

potete aiutarmi? Grazie in anticipo!
 
Dunque, mi pare che con il primo while inizializzi l'array per i mesi <= di quello attuale.
Il secondo while se $last non è 12, non parte neanche (quindi poi l'array è riempito a metà).
Al di là di questo, non capisco perché usi un array, quando puoi calcolare tutto "al volo". Poi magari vuoi fare delle visualizzazioni particolari (anche se immagino un mese per volta), ma a quanto pare il fatto che ti trovi in una certa data non è più di tanto rilevante dato che l'array ha come primo elemento l'1 gennaio e come ultimo elemento il 31 dicembre.
 
Innanzitutto ti ringrazio per avermi risposto; penso però che tu non abbia ben letto il codice... mi spiego meglio; il mio intento è quello di costruire un array i cui indici corrispondono ai giorni settimanali...es array[30]=5 , array[29]=4, array[27]=3.... etc. in tal modo (avendo sotto mano tutti i giorni tramite l'array) posso gestire in maniera completa il calendario.

Dunque, mi pare che con il primo while inizializzi l'array per i mesi <= di quello attuale

No, in realtà il primo while fa in modo che l'array si vada ad inizializzare per i giorni (motivo per il quale l'ho chiamato gmese - nota che il mese è già definito con $mese) (se ad esempio oggi è array[12]=1 questo produrrà $array[11]=0, $array[10]=6, $array[9]=5, $array[8]=4 - infatti ad esempio al giorno 8 corrisponde proprio giovedi...

Il secondo while se $last non è 12, non parte neanche (quindi poi l'array è riempito a metà).


Ovviamente non è valido come discorso poiché come ti ho scritto serve per vedere rispettivamente se l'ultimo giorno del mese è il 31, il 30 , il 29 o il 28.

Al di là di questo, non capisco perché usi un array, quando puoi calcolare tutto "al volo". Poi magari vuoi fare delle visualizzazioni particolari (anche se immagino un mese per volta), ma a quanto pare il fatto che ti trovi in una certa data non è più di tanto rilevante dato che l'array ha come primo elemento l'1 gennaio e come ultimo elemento il 31 dicembre.

Come già detto con questo array potrei avere sotto controllo tutti i giorni dell'anno e del mese corrente; quindi posso fare visualizzare il calendario a mio piacimento.
 
ok credo di aver risolto; in realtà lo scipt da me eseguito non aveva problema; il fatto è che
$gmese=$data['mday'];
$gsett=$data['wday'];


si riferiscono rispettivamente al mese del giorno e al giorno settimanale attuale; motivo per il quale non posso andare a modificare il mese... oppure potrei modificare la data e il giorno del calendario sul mio p.c. .

P.S. Sopra $mese l'ho impostato manualmente a 4; in realtà basta modificarlo a $data['mon'];
 
A chi può servire ecco come ho fatto per costruire un calendario mensile:

Codice:
<?php



/*ottengo le variabili*/

$data=getdate();
$gmese=$data['mday'];
$gsett=$data['wday'];
$mese=$data['mon'];
$year=$data['year'];

/*comincio a costruire l'array ($array) portandolo all'inizio
che contiene le corrispondenze tra giorno del 
mese e giorno numerico della settimana*/

while($gmese>0){
$array[$gmese--]=$gsett--;
if($gsett<0)$gsett=6;
}

/*Vedo quale sia l'ultimo giorno del mese*/
if(checkdate($mese,28,$data['year']))$last=28;
if(checkdate($mese,29,$data['year']))$last=29;
if(checkdate($mese,30,$data['year']))$last=30;
if(checkdate($mese,31,$data['year']))$last=31;

echo '<br /><h1>';
switch($mese){
case 1:echo 'Gennaio'; break; 
case 2:echo 'Febbraio'; break;
case 3:echo 'Marzo'; break;
case 4:echo 'Aprile'; break;
case 5:echo 'Maggio'; break;
case 6:echo 'Giugno'; break;
case 7:echo 'Luglio'; break;
case 8:echo 'Agosto'; break;
case 9:echo 'Settembre'; break;
case 10:echo 'Ottobre'; break;
case 11:echo 'Novembre'; break;
case 12:echo 'Dicembre'; break;
default:echo 'Mese';} 
echo '  '. $year . '</h1><br /> ';

while($gmese<$last){

$array[$gmese++]=$gsett++;
if($gsett>6)$gsett=0;
if($gsett==$data['wday']&&$gmese==$data['mday']){echo '<font color=\'red\'>Oggi &egrave; </font><br />';}
echo 'Giorno del mese: ' . $gmese.'<br />';
echo 'Giorno della settimana: ';
switch($gsett){
case 0: echo 'Domenica';break;
case 1: echo 'Lunedi';break;
case 2: echo 'Martedi';break;
case 3: echo 'Mercoledi';break;
case 4: echo 'Giovedi';break;
case 5: echo 'Venerdi';break;
case 6: echo 'Sabato';break;}

echo '<hr>';
}

?>

Ovviamente in questo caso la formattazione del mese è abbastanza semplice (ho inserito una scritta in rosso "Oggi è")... ma si può formattare in molti altri modi ad esempio con una clausola if si potrebbe evidenziare il girono corrente, oppure si potrebbere inserire tutto in una tabella... insomma dipende dalle occorrenze -
p.s.; Se trovate errori fatemi sapere!!!
 
Ultima modifica:
Sì, hai ragione: avevo letto il codice un po' velocemente :-P Ma più che altro non avevo capito a che serviva usare un vettore per memorizzare i calcoli che poi comunque devi fare ad ogni visualizzazione, quindi era questo che pensavo di chiarire prima di vedere dov'era l'errore (tanto per non correggere un sorgente che non serviva ;)).

L'uso dell'array non mi sembra vantaggioso comunque.
Se devo visualizzare il mese $mese, calcolo come hai fatto $last.
Faccio un ciclo for da 1 a $last, calcolando che giorno della settimana è l'1, mi incremento $gsett ogni volta che visualizzo il giorno del calendario (se usi il mod 7 ti eviti l'if per quando $gsett>6). Quando il giorno corrisponde a oggi, scrivo "Oggi è" (o qualunque cosa mi serva per evidenziare la giornata di oggi), altrimenti visualizzo normalmente il giorno.

Avrei invece usato i vettori al posto dei 2 case, in questa maniera:
$nomeMese=array(1 => "Gennaio", 2 => "Febbraio" ... 12 => "Dicembre")
così il mese $mese ha nome $nomeMese[$mese] (niente case).
Analogo per i giorni della settimana:
$nomeGiorno=array(0 => "Domenica", 1 => "Lunedì", ..., 6 => "Sabato")
così il giorno $giorno cade di $nomeGiorno[$giorno] (niente case).

Soprattutto se visualizzi un mese per volta, non ha senso precalcolare tutto l'anno in vettori. Ancora meno senso ha (sempre secondo me) se ogni volta che devi cambiare mese devi comunque ricaricare la pagina php.
 
Programmatore ti ringrazio per i tuoi consigli e per la tua attenzione; non ti nascondo che il calendario mensile che ho realizzato ha uno scopo fondamentalmente didattico (in quanto ho cercato di realizzarlo sfruttando un po e un po di conoscenze - o meglio sto imparando a memoria le principali funzioni del php).

Visto che mi trovavo a ripassare gli array ho tentato di tirare giù qualcosa del genere...

Comunque per quanto riguarda la sostituzione di switch in array, sono pienamente d'accordo (ma come dtto precendetemente ha uno scopo personalmente didattico)

per quanto riguarda il ciclo for non sono d'accordo poiché se ad esempio devo inserire il calendario in una tabella che ha come testa: LUN - MAR - MER - GIO - VEN - SAB DOM devo poter contare il numero di celle vuote e con un ciclo for mi troverei spiazzato- mentre sfruttando l'array potrei semplicemente scrivere:

Codice:
/*Imposto la variabile contenete il numero di celle vuoto*/
$vuoto=0

/*finchè la var $vuoto è minore del primo giorno settimanale (corripsondente a $array[1]) mi dai delle celle vuote*/
while($vuoto<$array[1]){echo '<td></td>';$vuoto++;}

per ciò che invece riguarda la formattazione di un'eventuale sfondo si potrebbe affinchiare in questo modo

Codice:
$formattazione='';
<td <?php echo $formattazione; ?>></td>

quindi ad una certa data posso far corrispondere uno sfondo impostando il bgcolor in questo modo:

Codice:
if($mese==4 && $gmese==30) $formattazione=" bgcolor='yellow' ";

Ma ripeto comunque ha uno scopo personalmente ditattico... però penso che possa essere buono a chi magari vuole inserire nella sua pagina un calendario che abbia il controllo su tutti i gironi del mese.
 
Per usare un ciclo for, il numero di celle vuote sarebbe uguale a (giorno+6) mod 7.
Esempio:
mercoledì è la terza cella da sinistra, mercoledì=3 (risultato del php), (3+6) mod 7 = 2 celle vuote.
Domenica è 0 e ci sono 6 celle vuote (infatti è la settima casella della riga).

Quindi ciclo for da 1 a 2 per le celle vuote, da 1 a $last per i giorni del mese, da $last+1 a 35 (5 righe del calendario) per altre celle vuote.
Comunque se volevi usare gli array per scopo didattico va benissimo così :)
 

Discussioni simili