Contare le settimane di un mese

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.606
54
48
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(0, 0, 0, $month, 1, $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 == 7 || $i == $giorni_nel_mese) {
            // recupero il timestamp del giorno
            $time_giorno = mktime(0, 0, 0, $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:
 
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(0, 0, 0, $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(0, 0, 0, $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(0, 0, 0, $month, $i + (7 - $giorno_settimana), $year));
                // recupero il lunedi
                $lunedi = date('d/m/Y', mktime(0, 0, 0, $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:
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
 
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(0, 0, 0, $month, $i - ($giorno_settimana + $i), $year));
con
PHP:
// recupero il lunedi
$lunedi = date('d/m/Y', mktime(0, 0, 0, $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:

Discussioni simili