Autor Zpráva
Vareee
Profil
Dobrý deň, narazil som na problém
<?
          for($a = 0; $a < $number; $a++)
          {               
            $processed = $days[$a];          
            echo $processed;
            echo $time;            
            $renderClass = $this->arrayCheck($events, $processed, $time);                
          }
?>
Cyklus for beží od 0 po 30 (v teste je to tak napevno nastavené)

krok1. výsledok premennej processed v echu 2013-02-25, time v echu 01:00, do funkcie dosadzuje 2013-02-25, 01:00
krok2. výsledok premennej processed v echu 2013-02-26, time v echu 01:00, do funkcie dosadzuje 2013-02-25, 01:00
krok3. výsledok premennej processed v echu 2013-02-27, time v echu 01:00, do funkcie dosadzuje 2013-02-25, 01:00

atd. ako je niečo takéto možné?
Tori
Profil
Vareee:
Jak vypadá metoda arrayCheck? V tom původním kalendáři myslím není. $processed je řetězec nebo třeba pole?
Vareee
Profil
$processed = $days[$a];          
echo $processed;

processed je dátum (vo formáte Y-m-d). Máte pravdu, metóda arrayCheck v pôvodnej verzií nie je, momentálne som sa skontaktoval s autorom, ktorý bol veľmi ústretový a poslal mi novšiu nepublikovanú verziu tej triedy. Autor žiaľ nemá čas sa mne a ani tej triede viac venovať, preto som si niektoré veci už upravil.. Na druhú stranu si nemyslím že tá samotná trieda je až tak podstatná. Ide vážne o ten kus kódu. Premennú $processed som vytvoril práve a len s toho dôvodu že pri použití $days[$a] to robilo tieto "haluze" a chcel som skúsiť natvrdo pretypovať jej formáť.

Späť k metóde arrayCheck, tú autor nechal pomerne variabilnú s nejakými ukážkami, ja som ju aktuálne v podstate celú zmazal aby som videl čo prejde do jej "vnútra"..
      function arrayCheck($array, $day, $time)
      {
          echo "vo funkcii $day - $time ";
           echo "<hr>";
          }

Výsledkom je ale stále to isté.
- v cykle sa echo $processed mení
- v metóde arrayCheck, s takýmto kódom, nie.

Vôbec tomu nerozumiem....
peta
Profil
<?php
function arrayCheck($array, $day, $time)
{
return " " . "$day - $time\n";
}

$events = "";
$days   = array(
    "2013-02-25",
    "2013-02-26",
    "2013-02-27"
    );
$time   = "1:00";
$number = 3;
echo "<pre>";

for($a = 0; $a < $number; $a++)
{               
$processed = $days[$a];          
echo " " . $processed;
echo " " . $time;
echo $renderClass = arrayCheck($events, $processed, $time);
}
?>

Vypise:
2013-02-25 1:00 2013-02-25 - 1:00
2013-02-26 1:00 2013-02-26 - 1:00
2013-02-27 1:00 2013-02-27 - 1:00
Vareee
Profil
Peťa, ďakujem za ochotu ale celkom neviem čo ste mi tých chcela dokázať. Ja v rozumiem tomu že takto by to malo ísť ale realita je taká že sa to chová ako som opísal..

Aby som pravdu povedal podľa mňa sa celé PHP chová dosť podivne.. Napr. jednoduché porovanie časov, kde chcem zistiť či time4check je intervale od timeform do timeto:

          $time4check = strtotime("22:30");
          $timefrom = strtotime("01:00");
          $timeto = strtotime("20:00");
          
          if($time4check >= $timefrom && $time4check <= $timeto)
          {              
              echo "je v intervale";
          }
          else
          {
              echo "nie je v intervale";
          }       

Takto to zbehne ale čo ak chcem mať v timefrom 1 hodinu a v timeto 24:00 (prípadne 00:00)

Pokus 1. Dosadím tam 24:00, vráti haluz (ano viem v manuále je písané že strtotime nepozná 24:00)
Pokus 2. Tak tam teda dám 00:00 a výsledkom sú opäť haluze.
Tori
Profil
Vareee:
v timeto 24:00 (prípadne 00:00)
To je rozdíl. `00:00` je začátek dnešního dne, `24:00` je začátek zítřejšího dne (aspoň u mě). `24:59` je za minutu jedna zítra ráno, 25 už se nedá použít.
Možná by ten problém ↑ mohla ještě způsobovat cache prohlížeče (ale to jen tipuju; v tom kódu, který jste poslal chyba není, tzn. buď je v jiné části kódu anebo mimo kód).
donny
Profil
Tori:
To je rozdíl. `00:00` je začátek dnešního dne, `24:00` je začátek zítřejšího dne (aspoň u mě). `24:59` je za minutu jedna zítra ráno, 25 už se nedá použít.

Ano? Máte zvláštne hodiny, moje 24:59 neukazujú :)

Vareee
Pokus 1. Dosadím tam 24:00, vráti haluz (ano viem v manuále je písané že strtotime nepozná 24:00)

Strtotime nemá čo poznať pretože 24:00 neexistuje, v 24 hodinovom formáte deň končí presne 23:59:59 potom následuje nový deň tj. 0:00. V tomto prípade by som použil mktime, ktorá dokáže urobiť Unix timestamp aj z 24:00..

<?php
function getTimeFromString($time){
    $time = explode(':', $time);
    return mktime($time[0], $time[1], $time[2]);
}
$timeto = getTimeFromString("24:00");
?>
YoSarin
Profil
Vareee
Hmm, a není ten $time4check náhodou kompletní (i s datem)? (to kdyby se načítal z db, pokud tam napíšeš opravdu jen "00:00" tak by to fungovat mělo...
Jaké hodnoty vracejí jednotlivá strtotime?
Moderátor Joker: Odstraněn přivolávač moderátorů

donny:
od PHP 5.3 strtotime 24:xx zvládá.
Vareee
Profil
YoSarin:
Hmm, a není ten $time4check náhodou kompletní (i s datem)? (to kdyby se načítal z db, pokud tam napíšeš opravdu jen "00:00" tak by to fungovat mělo...
ne není, načítať s databázy to chcem, ale momentálne už som sa vrátil späť k samotnej funkčnosti toho overenia.


Jaké hodnoty vracejí jednotlivá strtotime?

          $time4check = strtotime("22:30");
          echo $time4check."<br>";           
          $timefrom = strtotime("11:00");
          echo $timefrom."<br>";
          $timeto = strtotime("00:00");
          echo $timeto."<br>";
          $timeto = getTimeFromString("24:00");          
          echo $timeto."<br>";
Výsledky
1361827800
1361786400
1361746800
1361833200

Z tohoto je jasne vidieť že Tori má pravdu a zároveň if funguje správne, čo je ale zvláštne je strtotime.

donny:
s tou tvojou funkciou to vyhodnotí správne, ale keď to spustím v kompletnom kalendári tak to znázorňuje o polhodinu pozadu :D idem sa asi obesiť.

Update

Ak to spravím takto
          $time4check = strtotime("22:30");
          echo $time4check."<br>";           
          $timefrom = strtotime("11:00");
          echo $timefrom."<br>";
          $timeto = strtotime("24:00");
          echo $timeto."<br>";
          $timeto = getTimeFromString("24:00");          
          echo $timeto."<br>";

vráti toto
1361827800
1361786400

1361833200
YoSarin
Profil
hmm, btw, jak už vlastně psala Tori (a mně to nedošlo), mít v $timeto čas 00:00 je nesmysl (timeto je menší než timefrom a kontroluješ data v intervalu který vlastně neexistuje).
Moderátor Joker: Odstraněn přivolávač moderátorů
donny
Profil
Vareee

Podľa mňa si strašným ale strašným spôsobom nepochopil celý ten skript a tiež princíp toho čo robíš. Skús si otvoriť denný kalendár v outlooku, alebo inom programe.

Uvidíš jeden zásadný omyl s ktorým celý čas pracuješ, 0:00 nie je dole ale hore, tým štandardne deň začína nie končí! To ti celú tú tvoju logiku posúva úplne inam.
peta
Profil
Vareee:
Vzal jsem tvuj kod, doplnil o data, ktera v nem chybela, spustil a ukazal ti, ze ten kod funguje spravne. Zkus pouzit v cistem php souboru muj kod a uvidis, jestli se bude chovat tez spravne. To dokazuje, ze chybu zpusobuje prave ta cast kodu, kterou jsi si nechal pro sebe. Bohuzel to dela kazdych 9/10 z tazajicich. Vcetne mne, obcas :)
Joker
Profil
YoSarin:
Poznámka mimo téma, tři m-ka přivolají moderátory, pokud to není záměr, doporučuji psát „hmm“ v běžné formě (se dvěma m) ;-)
Tori
Profil
Vareee:
Ještě k tomuto: if($time4check >= $timefrom && $time4check <= $timeto) - tím ověřujete, jestli se uvnitř intervalu nachází jeden okamžik (čas $time4check), anebo tím ověřujete jestli se událost (= taky interval) nachází uvnitř jiného intervalu? V druhém případě by muselo být jiné porovnání:
if ($zacatek_udalosti <= $konec_intervalu && $konec_udalosti >= $zacatek_intervalu) 
    echo 'udalost je aspoň zčásti uvnitř intervalu';
YoSarin
Profil
Joker:
Pardon, to už je asi podruhý co se mi to stalo, vždycky mi to vypadne... :)

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: