Contare le settimane di un mese

Discussione in 'Snippet PHP' iniziata da criric, 27 Maggio 2012.

  1. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    Ciao,
    Questa funzione crea un array contenente informazioni sulle settimane del mese passato come parametro.
    Io ho messo il numero della settimana nell'anno come indice, il numero e il giorno di inizio e fine settimana nel valore.
    Modificandolo a vostro piacere potrete mettere nell'array i valori che vi servono.
    PHP:
    <?php

    // array per i mesi il primo elemento è fittizio (1)
    $mesi = array(1'Gennaio''Febbraio''Marzo''Aprile''Maggio''Giugno''Luglio''Agosto',
        
    'Settembre''Ottobre''Novembre''Dicembre');

    // dichiaro il nome della funzione
    function settimane_nel_mese($month$year) {
        
    // array per i giorni della settimana il primo elemento è fittizio (1)
        
    $giorni_settimana = array(1"Lun""Mar""Mer""Gio""Ven""Sab""Dom");
        
    // recupero il timestamp del primo giorno del mese
        
    $time_primo_del_mese mktime(000$month1$year);
        
    // recupero il numero per il giorno della settimana (0->Dom 6->Sab)
        
    $primo_del_mese date('w'$time_primo_del_mese);
        
    // conto i giorni del mese
        
    $giorni_nel_mese cal_days_in_month(CAL_GREGORIAN$month$year);
        
    // inizializzo un array che conterra i dati delle settimane
        
    $settimane = array();
        
    // dichiaro una variabile che mi servirà per tenere il conto dei giorni da 0 a 6
        
    $giorni 0;
        
    // assegno ad una variabile il numero per il giorno della settimana
        
    $j $primo_del_mese;
        
    // inizio il ciclo
        
    for ($i 1$i <= $giorni_nel_mese$i++) {
            
    // se il giorno arriva a Domenica(7) o se è l'ultima iterazione
            
    if ($j == || $i == $giorni_nel_mese) {
                
    // recupero il timestamp del giorno
                
    $time_giorno mktime(000$month$i$year);
                
    // recupero il numero della settimana nell'anno
                
    $numero_settimana date('W'$time_giorno);
                
    // calcolo la partenza della settimana girono e numero
                
    $giorno_partenza $j $giorni;
                
    $numero_partenza $i $giorni;
                
    // popolo l'array che come indice avrà il numero della settimana
                // come valore ho calcolato il giorno e il numero di partenza e di fine della settimana
                
    $settimane[(int) $numero_settimana] = "da $giorni_settimana[$giorno_partenza] $numero_partenza a $giorni_settimana[$j] $i ";
                
    // riporto al lunedi le varibili
                
    $j 1;
                
    $giorni 0;
                
    // altrimenti
            
    } else {
                
    // incremento i valori
                
    $j++;
                
    $giorni++;
            }
        }
        return 
    $settimane;
    }

    // valorizzo il mese
    $month '05'// maggio
    // valorizzo l'anno
    $year 2012;
    // richiamo la funzione 
    $settimane settimane_nel_mese($month$year);
    // mostro il mese e l'anno valorizzati
    echo "<p> Settimane per il mese di " $mesi[(int) $month] . $year </p>";
    // mostro l'array
    foreach ($settimane as $key => $value) {
        echo 
    "Settimana $key : $value <br/>";
    }
    ?> 
    Se a voi è venuto in mente qualcosa di piu semplice postate pure

    :byebye:
     
  2. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    Rileggendo lo script a due anni di distanza mi sono accorto che non funziona molto bene :crying:
    provo a rifarlo :
    PHP:
    <?php

    // array per i mesi il primo elemento è fittizio (1)
    $mesi = array(1'Gennaio''Febbraio''Marzo''Aprile''Maggio''Giugno''Luglio''Agosto',
        
    'Settembre''Ottobre''Novembre''Dicembre');

    // dichiaro il nome della funzione
    function settimane_nel_mese($month$year) {
        
    // conto i giorni del mese
        
    $giorni_nel_mese cal_days_in_month(CAL_GREGORIAN$month$year);
        
    // inizializzo un array che conterra i dati delle settimane
        
    $settimane = array();
        
    // inizio il ciclo
        
    for ($i 1$i <= $giorni_nel_mese$i++) {
            
    // timestamp del giorno
            
    $time_giorno mktime(000$month$i$year);
            
    // giorno della settimana
            
    $giorno_settimana date('w'$time_giorno);
            
    // recupero il numero della settimana nell'anno
            
    $numero_settimana date('W'$time_giorno);
            
    // se è domenica
            
    if ($giorno_settimana == 0) {
                
    // recupero la data della domenica
                
    $domenica date('d/m/Y'$time_giorno);
                
    // recupero il lunedi precedente
                
    $lunedi date('d/m/Y'mktime(000$month$i 6$year));
                
    // popolo l'array
                
    $settimane[(int) $numero_settimana] = "dal $lunedi al $domenica";
            }
            
    // se è l'ultima iterazione devo calcolare l'ultima settima
            
    if ($i == $giorni_nel_mese) {
                
    // se l'ultimo giorno è domenica non devo fare niente
                
    if ($giorno_settimana 0) {
                    
    // altrimenti recupero la domenica sucessiva
                    
    $domenica date('d/m/Y'mktime(000$month$i + ($giorno_settimana), $year));
                    
    // recupero il lunedi
                    
    $lunedi date('d/m/Y'mktime(000$month$i - ($giorno_settimana $i), $year));
                    
    // popolo l'array
                    
    $settimane[(int) $numero_settimana] = "dal $lunedi al $domenica";
                }
            }
        }
        return 
    $settimane;
    }

    // valorizzo il mese
    $month date('m');
    // valorizzo l'anno
    $year date('Y');
    // richiamo la funzione 
    $settimane settimane_nel_mese($month$year);
    // mostro il mese e l'anno valorizzati
    echo "<p> Settimane per il mese di " $mesi[(int) $month] . $year </p>";
    // mostro l'array
    foreach ($settimane as $key => $value) {
        echo 
    "Settimana $key : $value <br/>";
    }
    ?>
    speriamo che funzioni meglio

    EDIT:
    vabbè lasciamo perdere. Oggi non è giornata :evil:
    Lo sistemo con calma domani. O se avete voglia voi .....
     
    Ultima modifica: 23 Giugno 2014
  3. MarcoGrazia

    MarcoGrazia Utente Attivo

    Registrato:
    15 Dicembre 2009
    Messaggi:
    664
    Mi Piace Ricevuti:
    7
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Sviluppare web design (Studiare)
    Località:
    Udine
    Home Page:
    Quante settimane in un mese? Un momento le settimane in un mese sono sempre 4 ( 7 per 4 = 28 ) al massimo puoi verificare le occorrenze di un giorno in un mese, ad esempio nel mese di ottobre 2014 ci sono 5 occorrenze del mercoledì, ma mai ci sarà una settimana in più completa perché 5 per 7 fa 35 e un mese di 35 giorni... quindi la soluzione più probabile è contare le occorrenze di ogni singolo giorno in un mese, oppure semplicemente verificare che giorno della settimana è il primo di ogni mese.
    Questo mese è mercoledì ( ottobre 2014 ) il mese ha 31 giorni.
    Ora sai due cose, che non comincia per Domenica/Lunedì ( giorno 0 per i sistemi anglosassoni o per quello italiano ) se assumi Domenica come giorno 0, avrai che mercoledì è il quarto giorno e ne mancano 3 per arrivare al settimo giorno di una settimana, quindi: 31 - 28 = 3 giorni rimanenti, ovvero mercoledì, giovedì, venerdì ultimo giorno del mese e qusti sono sempre i mesi che ricorrono 5 volte per questo mese nell'anno 2014.
    La formula quindi sarà (giorni nel mese) - 28 ( 4 settimane ) = giorni rimanenti. Quindi contando i giorni rimanenti a partire dal nome del primo giorno del mese, avrai sempre l'ultimo giorno del mese.
    Il problema rimane con Febbraio che è quasi sempre di 28 giorni e si sa che 28 - 28 fa 0 quindi teoricamente non ci sono formule da verificare, ma non è vero ad esempio quest'anno febbraio aveva solo 3 settimane complete perché iniziava di sabato.
    Ora la sottrazione dei giorni da zero come risultato, il mese inizia di sabato e secondo la formula di prima dovrebbe finire con sabato, ma sarebbe vero se il risultato fosse stato uno, allora la formula va modificata per i febraio di 28 giorni a meno uno, infatti l'ultimo giorno di febbraio 2014 era venerdì, meno uno rispetto a sabato.
    Un'ultima considerazione, il calendario del 2012 mi dava per il primo giorno di settembre un bel sabato! La fine del mese era domenica ( 30 - 28 = 2 = sabato, domenica ) questo però non significa che siccome ci sono state 5 domeniche in quel mese ci fossero anche 5 settimane complete.
    Ora vedi tu come tradurre il tutto in una formuletta :D
     
  4. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    Ciao, ammetto che il titolo potrebbe ingannare,
    quando ho creato lo script mi serviva un menu a tendina contenente le settimane complete dal lunedi alla Domenica per una ricerca sul database.
    Dovevo naturalmente tener conto dei giorni del mese precedente per quanto riguardava la prima settimana e del mese sucessivo per l'ultima.

    Nel secondo script che ho postato è sufficiente modificare
    PHP:
    // recupero il lunedi
    $lunedi date('d/m/Y'mktime(000$month$i - ($giorno_settimana $i), $year));
    con
    PHP:
    // recupero il lunedi
    $lunedi date('d/m/Y'mktime(000$month$i - ($giorno_settimana 1), $year));
    Ciclando tutti i mesi dell'anno

    PHP:
    for ($i 1$i <= 12$i++) {
        
    // valorizzo il mese
        
    $month $i;
        
    // valorizzo l'anno
        
    $year date('Y');
        
    // richiamo la funzione 
        
    $settimane settimane_nel_mese($month$year);
        
    // mostro il mese e l'anno valorizzati
        
    echo "<p> Settimane per il mese di " $mesi[(int) $month] . $year </p>";
        
    // mostro l'array
        
    foreach ($settimane as $key => $value) {
            echo 
    "Settimana $key : $value <br/>";
        }
    }
    ottengo il seguente output che a prima vista mi pare corretto

    Codice:
    Settimane per il mese di Gennaio 2014
    Settimana 1 : dal 30/12/2013 al 05/01/2014
    Settimana 2 : dal 06/01/2014 al 12/01/2014
    Settimana 3 : dal 13/01/2014 al 19/01/2014
    Settimana 4 : dal 20/01/2014 al 26/01/2014
    Settimana 5 : dal 27/01/2014 al 02/02/2014
    
    Settimane per il mese di Febbraio 2014
    Settimana 5 : dal 27/01/2014 al 02/02/2014
    Settimana 6 : dal 03/02/2014 al 09/02/2014
    Settimana 7 : dal 10/02/2014 al 16/02/2014
    Settimana 8 : dal 17/02/2014 al 23/02/2014
    Settimana 9 : dal 24/02/2014 al 02/03/2014
    
    Settimane per il mese di Marzo 2014
    Settimana 9 : dal 24/02/2014 al 02/03/2014
    Settimana 10 : dal 03/03/2014 al 09/03/2014
    Settimana 11 : dal 10/03/2014 al 16/03/2014
    Settimana 12 : dal 17/03/2014 al 23/03/2014
    Settimana 13 : dal 24/03/2014 al 30/03/2014
    Settimana 14 : dal 31/03/2014 al 06/04/2014
    
    Settimane per il mese di Aprile 2014
    Settimana 14 : dal 31/03/2014 al 06/04/2014
    Settimana 15 : dal 07/04/2014 al 13/04/2014
    Settimana 16 : dal 14/04/2014 al 20/04/2014
    Settimana 17 : dal 21/04/2014 al 27/04/2014
    Settimana 18 : dal 28/04/2014 al 04/05/2014
    
    Settimane per il mese di Maggio 2014
    Settimana 18 : dal 28/04/2014 al 04/05/2014
    Settimana 19 : dal 05/05/2014 al 11/05/2014
    Settimana 20 : dal 12/05/2014 al 18/05/2014
    Settimana 21 : dal 19/05/2014 al 25/05/2014
    Settimana 22 : dal 26/05/2014 al 01/06/2014
    
    Settimane per il mese di Giugno 2014
    Settimana 22 : dal 26/05/2014 al 01/06/2014
    Settimana 23 : dal 02/06/2014 al 08/06/2014
    Settimana 24 : dal 09/06/2014 al 15/06/2014
    Settimana 25 : dal 16/06/2014 al 22/06/2014
    Settimana 26 : dal 23/06/2014 al 29/06/2014
    Settimana 27 : dal 30/06/2014 al 06/07/2014
    
    Settimane per il mese di Luglio 2014
    Settimana 27 : dal 30/06/2014 al 06/07/2014
    Settimana 28 : dal 07/07/2014 al 13/07/2014
    Settimana 29 : dal 14/07/2014 al 20/07/2014
    Settimana 30 : dal 21/07/2014 al 27/07/2014
    Settimana 31 : dal 28/07/2014 al 03/08/2014
    
    Settimane per il mese di Agosto 2014
    Settimana 31 : dal 28/07/2014 al 03/08/2014
    Settimana 32 : dal 04/08/2014 al 10/08/2014
    Settimana 33 : dal 11/08/2014 al 17/08/2014
    Settimana 34 : dal 18/08/2014 al 24/08/2014
    Settimana 35 : dal 25/08/2014 al 31/08/2014
    
    Settimane per il mese di Settembre 2014
    Settimana 36 : dal 01/09/2014 al 07/09/2014
    Settimana 37 : dal 08/09/2014 al 14/09/2014
    Settimana 38 : dal 15/09/2014 al 21/09/2014
    Settimana 39 : dal 22/09/2014 al 28/09/2014
    Settimana 40 : dal 29/09/2014 al 05/10/2014
    
    Settimane per il mese di Ottobre 2014
    Settimana 40 : dal 29/09/2014 al 05/10/2014
    Settimana 41 : dal 06/10/2014 al 12/10/2014
    Settimana 42 : dal 13/10/2014 al 19/10/2014
    Settimana 43 : dal 20/10/2014 al 26/10/2014
    Settimana 44 : dal 27/10/2014 al 02/11/2014
    
    Settimane per il mese di Novembre 2014
    Settimana 44 : dal 27/10/2014 al 02/11/2014
    Settimana 45 : dal 03/11/2014 al 09/11/2014
    Settimana 46 : dal 10/11/2014 al 16/11/2014
    Settimana 47 : dal 17/11/2014 al 23/11/2014
    Settimana 48 : dal 24/11/2014 al 30/11/2014
    
    Settimane per il mese di Dicembre 2014
    Settimana 49 : dal 01/12/2014 al 07/12/2014
    Settimana 50 : dal 08/12/2014 al 14/12/2014
    Settimana 51 : dal 15/12/2014 al 21/12/2014
    Settimana 52 : dal 22/12/2014 al 28/12/2014
    Settimana 1 : dal 29/12/2014 al 04/01/2015 
     
    Ultima modifica: 22 Ottobre 2014
Sto caricando...

Condividi questa Pagina