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!
 

programmatore

Utente Attivo
21 Ago 2009
111
0
0
programmatore.altervista.org
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.
 

emanuelevt

Utente Attivo
24 Giu 2009
298
0
0
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.
 

emanuelevt

Utente Attivo
24 Giu 2009
298
0
0
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'];
 

emanuelevt

Utente Attivo
24 Giu 2009
298
0
0
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:

programmatore

Utente Attivo
21 Ago 2009
111
0
0
programmatore.altervista.org
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.
 

emanuelevt

Utente Attivo
24 Giu 2009
298
0
0
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.
 

programmatore

Utente Attivo
21 Ago 2009
111
0
0
programmatore.altervista.org
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
Autore Titolo Forum Risposte Data
D [HTML] Aiutino su costruzione tabella :) HTML e CSS 3
M [PHP] costruzione sito dinamico PHP 1
A [PHP] Costruzione nuovo sito PHP 4
Frank10 [OFFRO] Lavoro per costruzione Sito Web Offerte e Richieste di Lavoro e/o Collaborazione 3
A [CERCO COLLABORAZIONE][GRATUITO] Cercasi programmatore per costruzione sito Offerte e Richieste di Lavoro e/o Collaborazione 1
T costruzione sito HTML e CSS 7
M costruzione primo forum PHP 3
M Retribuito - cercasi webmaster per costruzione sito ex novo Offerte e Richieste di Lavoro e/o Collaborazione 4
M Algoritmo calcolo costo risorse e tempo di costruzione PHP 4
O Cerco webmaster per costruzione sito web Offerte e Richieste di Lavoro e/o Collaborazione 5
R Programma per costruzione banner Webdesign e Grafica 1
E help costruzione sito HTML e CSS 1
P costruzione di un inscrizione in flash Flash 1
S Il mio sito sulla roma (in costruzione) Presenta il tuo Sito 1
S Chi mi aiuta con la costruzione di un sito? Altri Annunci 0
T Costruzione dinamica tabelle Coldfusion Programmazione 0
S consiglio costruzione pagina web Webdesign e Grafica 3
H aiuto costruzione sito HTML e CSS 5
M costruzione sito web Webdesign e Grafica 1
N Costruzione forum per un disperato PHP 6
M Plugin Calendario Appuntamenti WordPress 1
E Calendario appuntamenti \dipendenti PHP 0
F Calendario php? PHP 3
L [PHP] calendario PHP 0
R [WordPress] Calendario Personale per ogni Utente WordPress 0
maxnegri [javascript] calendario booking disponibilità Javascript 2
L [PHP] calendario: dati da DB in tabella PHP 1
K [PHP] Creazione di Calendario con orario PHP 4
Q Notice: Undefined index: codice in C:\xampp\htdocs\STAGE\calendario\modifica.php on line 10 PHP 8
A [Javascript] Datepicker - il calendario non si apre Javascript 16
Rhisen [PHP] Problema Calendario Eventi PHP 0
E [Javascript] Assegnazione variabile da campo input di tipo "a calendario" Javascript 3
Gaetano1991h Passaggio da calendario php a javascript PHP 2
V Servizio email con calendario condiviso Posta Elettronica 1
L Zimbra calendario Vs PHP PHP 0
G calendario collegato a database Classic ASP 2
felino [Wordpress] Ordine per Calendario Personalizzato WordPress 1
V Reperire le date della settimana del calendario jQuery 1
D Creare Calendario PHP PHP 0
A Pubblicazione dati su calendario settimanale jQuery 28
M Otttimizazione date calendario prenotazioni PHP 0
F Problema attivare/disattivare immagine calendario datepicker da select jQuery 1
M Calendario giornate campionato PHP 4
T PHP sync con gmail, rubrica google e calendario google PHP 0
felino [PHP][iCal] iCal: sincronizzazione e visualizzazione calendario PHP 2
L calendario e click <a href=' PHP 9
G Aggiornamento Calendario MS Access 3
felino Contact Form 7: calendario e formattazione messaggio WordPress 0
novello88 [EXCEL] Calendario precompilato Windows e Software 1
B Turno in quinta su calendario PHP 3

Discussioni simili