Autor Zpráva
jiricz
Profil
Zdravím,
předem se omlouvám, jestli se to zde již řešilo, ale hledal jsem a nenašel:)
Potřeboval bych poradit jak nejefektivněji vytvořit funkci která mi vypíše datum vzestupně, například každého úterý a pátku v daném měsíci. Stačilo by mě kdyby funkce uměla vypsat unixový čas, který bych si už na datum naformátoval.

Mám toto, ale potřebuji to tedy ještě nějak opodmínkovat:
$t = time();
$m = date('m',$t);
$r = date('Y',$t);
$number = cal_days_in_month(CAL_GREGORIAN, $m, $r);
$this_day = $t;
for ($i = 0; $i < $number; $i++) {
  $ukaz = date("d.m.Y", $this_day);
  echo'<p>'.$ukaz.'</p>';
}
Keeehi
Profil
function datesOfDaysInMonth($daysInWeek, $time = null, $format = 'd.m.Y') {
    if(!is_string($format)) {
        return false;
    }

    if($time === null) {
        $time = time();
    }
    
    if(!is_numeric($time)) {
        return false;
    }
    
    $time = (int)$time;

    if(is_numeric($daysInWeek)) {
        $daysInWeek = [(string)((int)$daysInWeek)];
    }

    if(!is_array($daysInWeek)) {
        return false;
    }

    $daysInWeek = array_unique(array_values($daysInWeek));

    for($i = 0; $i < count($daysInWeek); $i++) {
        if(!is_numeric($daysInWeek[$i])) {
            return false;
        }
        
        $daysInWeek[$i] = (int)$daysInWeek[$i];
        
        if($daysInWeek[$i] < 1 || $daysInWeek[$i] > 7) {
            return false;
        }
    }
    
    $month = date('m', $time);
    $year = date('Y', $time);
    $days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
    
    $result = [];
    for ($i = 1; $i <= $days; $i++) {
        $date = DateTime::createFromFormat('j.m.Y', "$i.$month.$year");
        if(in_array($date->format('N'), $daysInWeek, true)) {
            $result[] = $date->format($format);
        }
    }
    
    return $result;
}

Jako první parametr to bere číslo nebo string dne v týdnu (1 pondělí - 7 neděle), případně pole takových hodnot. Jako druhý dobrovolný parametr to bere timestamp ze kterého to určí příslušný rok a měsíc. Pokud neuvede druhý parametr zadán, vezme se aktuální měsíc a rok. Třetí nepovinný parametr určuje formát výstupu. Pokud je nějaký vstup špatně, funkce vrátí false (v ideálním případě by měla vyhodit výjimku a říct co je špatně) jinak vrátí pole s daty v daném formátu.

Funkce je tak dlouhá, jelikož ověřuje validitu vstupů. Pokud bychom předpokládali, že vstupy budou validní, pak by mohla vypadat takto.
function datesOfDaysInMonth($daysInWeek, $time = null, $format = 'd.m.Y') {
    if($time === null) {
        $time = time();
    }
    
    $month = date('m', $time);
    $year = date('Y', $time);
    $days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
    
    $result = [];
    for ($i = 1; $i <= $days; $i++) {
        $date = DateTime::createFromFormat('j.m.Y', "$i.$month.$year");
        if(in_array($date->format('N'), $daysInWeek, true)) {
            $result[] = $date->format($format);
        }
    }
    
    return $result;
}
Vstupem prvního parametru musí pak být pole řetězců (['1', '2', ...]) jinak to fungovat nebude
jiricz
Profil
Děkuji, přesně tak jsem to potřeboval.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0