Autor Zpráva
shaman171
Profil
Ahoj, mám jeden script, který mi vypisuje podle datumu program ze souboru ***.ini a vypisuje ho vždy až do konce souboru ini, prostě to co je tam napsáno.
Potřeboval bych to změnit tak, aby to vypisovalo jen v ten aktuální den ten aktuální řádek, který tomu dni přísluší v tom ini souboru, jestli mi rozumíte?
Pokoušel jsem se to bastlit, ale je to na mě moc.
Zmíněný script vypadá takto:
<?php
 $data = parse_ini_file(dirname(__FILE__) . '/rozpis.ini');//načte pole, kde číslo dne bude asociativní klíč
$dates = array();


$days = array(
    1    => 'ledna',
    'února',
    'března',
    'dubna',
    'května',
    'června',
    'července',
    'srpna',
    'září',
    'října',
    'listopadu',
    'prosince',
);



$today_date = date("Ymd"); 
foreach ($data as $i => $line) 
{
    $likeunix = str_replace("-", "", $i);
    $unix     = strtotime($i);
    

    
    if ($today_date <= $likeunix)
    {
        
        $day      = date("d", $unix);
        $month    = date("m", $unix);
        $year     = date("Y", $unix);    
        
        if ($month{0} == '0')
            $month = substr($month, 1);
            
        echo $day.'. '.$days[$month].' '.$year.' '.$line . "<br />";
    }
    
    
}
?>


INI soubor např. takto:
2011-08-26 =  "Dnes je na menu: mrkev  "
2011-08-29 =  "Dnes je na menu: petržel"
2011-08-30 =  "Dnes je na menu: jablko "
2011-08-31 =  "Dnes je na menu: paprika "
atd....


Moc děkuju za každou radu jak na to.
Jake898
Profil
<?php
$data = parse_ini_file(dirname(__FILE__) . '/rozpis.ini');

echo $data[date('Y-m-d', time())];
shaman171
Profil
Moc díky, jen nevím co dělám špatně, ale nefunguje mi to, jak má tedy teďka vypadat ten soubor se scriptem? Jen to co jsi napsal? Nebo to co píšeš má nahradit nějaké řádky?
Moc díky
Jake898
Profil
Jen to co jsem napsal.
Pokud je v souboru rozpis.ini řádek
...
2011-08-16 = "Dnes je na menu: mrkev"
...

tak to dnes vypíše ten text, jinak vyhodí chybu úrovně E_NOTICE.
shaman171
Profil
Aha, už tomu rozumím. Moc díky, teď jsem ale přišel na chybu u mě, potřeboval bych aby to vypsalo buďto ten řádek na aktuální den a pokud tam není, tak nejbližší možný. Je to reálné?
A když na to koukám, vypisovalo mi to jakoby i to datum k tomu, to bych tam také potřeboval.
Výpis by pak měl vypadat např.:"Dnes: 16.8.2011 Dnes je na menu: mrkev" to že je tam 2x dnes neřešme, to je příklad.
Jake898
Profil
No, něco jsem vymyslel, ale třeba někoho napadne lepší řešení.
<?php
$data = parse_ini_file(dirname(__FILE__) . '/rozpis.ini');

if (isset($data[date('Y-m-d', time())])){
	echo date('d.m.Y', time()) . ': ' . $data[date('Y-m-d', time())];
}else{
	foreach ($data as $date => $value){
		$datetime = DateTime::createFromFormat('Y-m-d', $date);
		if ($datetime->getTimestamp() >= time()){
			echo date('d.m.Y', $datetime->getTimestamp()) . ': ' . $value;
			break;
		}
	}
}

Ale není to ošetřený např. proti špatnému pořadí dat, takže pokud se v tom souboru dostane 2011-08-18 před 2011-08-17, tak to 16.8.2011 vypíše tu hodnotu k 2011-08-18.
shaman171
Profil
Moc děkuju.
Nechci si moc vymýšlet, ale nějak mi to nefunguje, vypíše mi to dnešní datum, ale už né to nejbližší další. Navíc mi to nevypisuje to datum.
Jinak ohledně pořadí dat to si ošetřím sám, to není problém.
Divné je, že mi to nevypíše ani chybu, prostě to nevypíše nic.
motik
Profil
shaman171
záleží k čemu to chceš - dá se s tím i vyhrát (dnes, zítra...)
$data = parse_ini_file('rozpis.ini');
$datum = date("Y-m-d");
$d = 0;
while (!isset($data[$datum]))
  {                                // do budoucna je +, do minulosti nahraď za -
    ++$d;
    $datum = date("Y-m-d", strtotime("+" . $d . " day"));
  }

switch ($d)
  {
    case 0: $den = "Dnes je"; break;
    case 1: $den = "Zítra bude"; break;
    case 2: $den = "Pozítří bude"; break;
    
    default: $den = "Časem bude"; 
  }
  
echo $den . ': ' . date("d.m.Y", strtotime("+" . $d . " day")) . ' ' . $data[$datum];

-------------------------------------------------------------------------
ten výpis už by si měl být schopný si upravit podle svého
Jake898
Profil
Ano, vypisuje to data k dnešnímu dni nebo data k nejbližšímu dni. Pokud jde o to, aby to vypsalo obojí, tak stačí odstranit konstrukt else.

<?php
$data = parse_ini_file(dirname(__FILE__) . '/rozpis.ini');

if (isset($data[date('Y-m-d', time())])){
    echo date('d.m.Y', time()) . ': ' . $data[date('Y-m-d', time())];
}

foreach ($data as $date => $value){
    $datetime = DateTime::createFromFormat('Y-m-d', $date);
    if ($datetime->getTimestamp() >= time()){
        echo date('d.m.Y', $datetime->getTimestamp()) . ': ' . $value;
        break;
    }
}
motik
Profil
motik:
while (!isset($data[$datum]))
ještě by tam mohla být podmínka proti zacyklení (třeba na 50 dní), kdyby tam náhodou ten záznam nebyl.
shaman171
Profil
motik Tohle je úplně přesně to co jsem potřeboval, jen jsem to neuměl napsat. Dokonalé!!
Moc Vám děkuju! :-)
Tori
Profil
shaman171:
Jake898: „není to ošetřený např. proti špatnému pořadí dat,
ksort
motik
Profil
shaman171:
Dokonalé!!
no dokonalé to není, hlavně si tam radši hoď tu podmínku!!!
---------------------------------------------------------------------------------------------
a do toho ini souboru necpat "Dnes je na menu:", dej si to až u výpisu
shaman171
Profil
Jak tam hodím tu podmínku?
Špatnému pořadí dat se snad vyvaruju při vytváření ini souboru.
motik
Profil
shaman171:
Špatnému pořadí dat se snad vyvaruju při vytváření ini souboru.
tady nejde ani tak o špatné pořadí dat, ale o zacyklení ("nekonečný cyklus")..
while (!isset($data[$datum]))

nahraď za
while (!isset($data[$datum]) and $d <= 50)


zkoumá to cca 50 dní dopředu - jestli chceš, tak si to číslo uprav
shaman171
Profil
Aha, super už mi to funguje jak má. Fakt super. Sem nadšen. Ještě jednou moc děkuji. Ušetří mi to hodiny práce.

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