Verifica giornate festive

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.606
54
48
TN
Ciao,
vado avanti con le mie funzioni sulle date
La prossima funzione verifica se un giorno è festivo: restituisce true o false in base al girono passato come parametro

Il parametro $data non è obbligatorio, se omesso la funzione restituisce l'array con le festività

Non ho considerato il Sabato ma come al solito a voi le eventuali modifiche

PHP:
<?php

function festivita($data = false) {
    // creo un array con le festivita
    $array_festivita = array(
        "01-01" => "Mio compleanno",
        "01-06" => "Epifania",
        "04-25" => "Festa della liberazione",
        "05-01" => "Festa dei lavoratori",
        "06-02" => "Festa della repubblica",
        "08-15" => "Ferragosto",
        "11-01" => "Festa di tutti i santi",
        "12-08" => "Festa dell'immacolata",
        "12-25" => "Natale",
        "12-26" => "Giorno di Santo Stefano"
    );
    // se non ho la data come argomento restituisco l'array
    if (!$data) {
        return $array_festivita;
    }
    // creo un array con la data ricevuta
    $exp = explode('-', $data);
    // verifico la data
    if (!checkdate($exp[1], $exp[2], $exp[0])) {
        // data non valida esco
        return "Data non valida!";
    }
    // time della data
    $timestamp = mktime(0, 0, 0, $exp[1], $exp[2], $exp[0]);
    // verifico se il giorno della settimana è Domenica con date('w') (0->Dom 6->Sab)
    if (date('w', $timestamp) == 0) {
        // Se = a 0 è festivo ! esco
        return true;
    }
    // altrimenti creo una variabile per la ricerca nell array
    $mesegiorno = $exp[1] . "-" . $exp[2];
    // ciclo l'array delle festivita
    foreach ($array_festivita as $key => $value) {
        // se trovo corrispondenza 
        if ($key == $mesegiorno) {
            // è festivo esco
            return true;
        }
    }
    // non è festivo esco
    return false;
}

// senza parametro restituisce un array
$res = festivita();
var_dump($res);

// con la data restituisce true se festivo false se lavorativo
$res = festivita("2012-12-24");
var_dump($res);
?>

Se ho dimenticato e/o sbagliato qualcosa segnalate pure :byebye:
 
Ultima modifica:
Ciao,
vado avanti con le mie funzioni sulle date
La prossima funzione verifica se un giorno è festivo: restituisce true o false in base al girono passato come parametro

Il parametro $data non è obbligatorio, se omesso la funzione restituisce l'array con le festività

Non ho considerato il Sabato ma come al solito a voi le eventuali modifiche

PHP:
<?php

function festivita($data = false) {
    // creo un array con le festivita
    $array_festivita = array(
        "01-01" => "Mio compleanno",
        "01-06" => "Epifania",
        "04-25" => "Festa della liberazione",
        "05-01" => "Festa dei lavoratori",
        "06-02" => "Festa della repubblica",
        "08-15" => "Ferragosto",
        "11-01" => "Festa di tutti i santi",
        "12-08" => "Festa dell'immacolata",
        "12-25" => "Natale",
        "12-26" => "Giorno di Santo Stefano"
    );
    // se non ho la data come argomento restituisco l'array
    if (!$data) {
        return $array_festivita;
    }
    // creo un array con la data ricevuta
    $exp = explode('-', $data);
    // verifico la data
    if (!checkdate($exp[1], $exp[2], $exp[0])) {
        // data non valida esco
        return "Data non valida!";
    }
    // time della data
    $timestamp = mktime(0, 0, 0, $exp[1], $exp[2], $exp[0]);
    // verifico se il giorno della settimana è Domenica con date('w') (0->Dom 6->Sab)
    if (date('w', $timestamp) == 0) {
        // Se = a 0 è festivo ! esco
        return true;
    }
    // altrimenti creo una variabile per la ricerca nell array
    $mesegiorno = $exp[1] . "-" . $exp[2];
    // ciclo l'array delle festivita
    foreach ($array_festivita as $key => $value) {
        // se trovo corrispondenza 
        if ($key == $mesegiorno) {
            // è festivo esco
            return true;
        }
    }
    // non è festivo esco
    return false;
}

// senza parametro restituisce un array
$res = festivita();
var_dump($res);

// con la data restituisce true se festivo false se lavorativo
$res = festivita("2012-12-24");
var_dump($res);
?>

Se ho dimenticato e/o sbagliato qualcosa segnalate pure :byebye:

Non vedo il motivo di tutto quel casino, basta semplicemente un controllo nell'array

PHP:
function festivita($data) {
    // creo un array con le festivita
    $array_festivita = array(
        "01-01" => "Mio compleanno",
        "01-06" => "Epifania",
        "04-25" => "Festa della liberazione",
        "05-01" => "Festa dei lavoratori",
        "06-02" => "Festa della repubblica",
        "08-15" => "Ferragosto",
        "11-01" => "Festa di tutti i santi",
        "12-08" => "Festa dell'immacolata",
        "12-25" => "Natale",
        "12-26" => "Giorno di Santo Stefano"
    );
    //controllo l'array e torno con l'eventuale festività essendo una stringa restituisce un valore boolean vero
    if(array_key_exists($data,$array_festivita)) return $array_festivita[$data];
    
    return false;
}

if(festivita(date('d-m')))
    echo 'Funzione semplificata';

$festivita = festivita(date('d-m')); //oppure ovviamente 'giorno-mese'

echo (!empty($festivita)) ? $festivita : 'Non ci sono festività';
Migliorata su compilatore e perfettamente funzionante :)
 
Ultima modifica:
array_key_exists
questa funzione non la conoscevo :fonzie:

Anche le domeniche sono festive

e un controllo sulla data che arriva non guasta
 
se ti sovvenisse un giorno di inserire anche Pasqua e lunedì dell'Angelo,
si calcola così
ciao
Marino
PHP:
<?php

// sito di riferimento : http://aa.usno.navy.mil/faq/docs/easter.php

$anno = 2014;
Pasqua($anno);

print "PASQUA : ".$Pgiorno."/".$Pmese."/".$anno."<br />";
print "LUNEDI : ".$Lgiorno."/".$Lmese."/".$anno."<br />";

function Pasqua($anno) {
  global $Pmese,$Pgiorno,$Lmese,$Lgiorno;

  $nc=intval($anno/100);
  $nn=$anno-19*intval($anno/19);
  $nk=intval(($nc-17)/25);
  $ni1=$nc-intval($nc/4)-intval(($nc-$nk)/3)+19*$nn+15;
  $ni2=$ni1-30*intval($ni1/30);
  $ni3=$ni2-intval($ni2/28)*(1-intval($ni2/28)*intval(29/($ni2+1))*intval((21-$nn)/11));
  $nj1=$anno+intval($anno/4)+$ni3+2-$nc+intval($nc/4);
  $nj2=$nj1-7*intval($nj1/7);
  $nl=$ni3-$nj2;

  $Pmese=3+intval(($nl+40)/44);
  $Pgiorno=$nl+28-31*intval($Pmese/4);

  if ($Pmese == 3 and $Pgiorno == 31) { $Lmese = 4; $Lgiorno = 1; }
  else { $Lmese = $Pmese; $Lgiorno = $Pgiorno + 1; }
}
?>
 

Discussioni simili