[PHP] Jak sprawdzić ilość wystąpień danego dnia tygodnia w ciągu miesiąca ?

przez | 6 grudnia, 2013

W związku z tym że nie ma gotowej funkcji na wyciągnięcie informacji ile razy w ciągu miesiąca wystąpił dany dzień to my napiszemy sobie takową. Założenie jest proste, przekazujemy do funkcji nazwę dnia np. „Piątek”, a funkcja zwraca informację ile razy występuje w danym miesiącu i roku.

Cały problem, który chcemy rozwiązać to czy dany dzień występuje 4 czy też 5 razy w danym miesiącu. Dlatego też nasza funkcja będzie poszukiwała takiej informacji, wzbogacimy ją także o możliwość podania numeru miesiąca oraz roku.

/**
 * Funkcja zwraca ilość wystąpień dnia tygodnia w miesiącu.
 * 
 * @param string $nazwaDnia nazwa dnia tygodnia
 * @param int|null $miesiac numer miesiąca, null oznacza bierzący miesiąc
 * @param int|null $rok rok, domyślnie aktualny rok
 * @return int
 */
function iloscWystapien($nazwaDnia, $miesiac = null, $rok = null) 
{
    $dni = array(    
        'Niedziela'    => 0, 
        'Poniedziałek' => 1, 
        'Wtorek'       => 2, 
        'Środa'        => 3, 
        'Czwartek'     => 4, 
        'Piątek'       => 5, 
        'Sobota'       => 6
    );

    //sprawdzamy jaki numer ma podana nazwa dnia
    $numerDnia = array_key_exists($nazwaDnia,$dni);

    if(is_null($miesiac))
        $miesiac = date('m');

    if(is_null($rok))
        $rok = date('Y');

    $start = date('w', mktime(0, 0, 0, $miesiac, 1, $rok));
    $ileDni = date('t', mktime(0, 0, 0, $miesiac, 1, $rok));
    $end = date('w', mktime(0, 0, 0, $miesiac, $ileDni, $rok));

    if($start > $end) 
    {
        $tmp = $start;
        $start = $end;
        $end = $tmp;
    }

    //jeśli podzieli się bez zera jest nie jest to luty który ma 28 dni
    if($ileDni%7) 
    {
        if($start <= $numerDnia && $end >= $numerDnia )
            return 5;
        else
            return 4;	

	//jeśli to luty który ma 28 dni
        } 
        else 
        {
            if($start == $end && $start == $numerDnia) 
                return 5;
            else 
                return 4;
	}
}

echo iloscWystapien('Poniedziałek');
echo iloscWystapien('Poniedziałek',3);

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *