Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Switch/Case i Daty
Forum PHP.pl > Forum > Przedszkole
Soks
Mam następujący problem:
Chcę, aby w zależności od daty zmienna przyjmowała określoną wartość, jako, że tych dat może być sporo zdecydowałem się napisać to w switch/case. Chciałem też użyć funkcji now(), gdyż na całej stronie jej stosowałem.
Napisałem coś takiego, lecz nie działa, zresztą nie spodziewałem się, że zadziała, ale chciałem spróbować:

  1. switch ($a = now()){
  2.  
  3. case (2010-03-13 12:00:00<=$a<=2010-03-13 14:40:00) :
  4. $zmienna = 2;
  5. break;
  6.  
  7. case (2010-03-13 14:40:01<=$a<=2010-03-13 14:45:00) :
  8. $zmienna = 3;
  9. break;
  10.  
  11. default :
  12. $zmienna = 5;
  13. break;
  14. }


I wyskakuje błąd:
Parse error: syntax error, unexpected T_LNUMBER....
Domyślam się, że w takiej formie tego się nie da zrobić, ale czy da się to zrobić korzystając z funkcji now()?
athei
Tak sobie nie porównasz.
Użyj http://pl.php.net/manual/en/function.strtotime.php
Soks
Dzięki niby powinno działać, ale:
Parse error: syntax error, unexpected T_IS_SMALLER_OR_EQUAL....

  1. $a=strtotime(date("Y-m-d"));
  2.  
  3. switch ($a){
  4.  
  5. case (strtotime(2010-03-12)<=$a<=strtotime(2010-03-13)) :
  6. $zmienna = 2;
  7. break;
  8.  
  9. case (strtotime(2010-03-14)<=$a<=strtotime(2010-03-15)) :
  10. $zmienna = 3;
  11. break;
  12.  
  13. default :
  14. $zmienna = 5;
  15. break;
  16. }


Wskazuje na błąd w miejscu, gdzie jest pierwszy case, wydaje mi się, że to coś z operatorem porównania, ale co?
athei
Po pierwsze data jest stringiem, bo masz - myślniki, czyli strtotime('2010-03-12').
Po drugie źle porównujesz
Kod
case (strtotime('2010-03-10')<=$a && $a<=strtotime('2010-03-11')) :
Soks
Dzięki działa, sam bym tego nie wymyślił smile.gif Masz pomógł.
Pilsener
Cytat
zdecydowałem się napisać to w switch/case
- bo? Ta instrukcja służy do funkcjonalnego dzielenia kodu, a nie tworzenia de facto pliku danych! Rozumiem, że zmienna ma przyjmować określoną wartość w zależności od przynależności do określonego przedziału?
  1. $dane[1] = array(0,10);
  2. $dane[2] = array(11,20);
  3. $dane[3] = array(21,30);
  4.  
  5. $parametr = 25; //wartość wejściowa, może być Twoja data
  6.  
  7. foreach($dane as $index => $wartosc){
  8. list($min,$max) = $wartosc;
  9. if($parametr>=$min && $parametr<$max){
  10. $przedzial = $index;
  11. break;
  12. }
  13. }
  14. echo $przedzial;
- proste i wydajne, bo gdy znajdziemy dany przedział kończymy wykonywanie kodu no i jak chcesz zmienić liczbę przedziałów to kod PHP będziesz edytował? PHP nie jest od przechowywania danych! Tablicę "dane" trzymasz w pliku lub bazie danych, wystarczy modyfikacja pliku/bazy bez konieczności zmieniania skryptu. Dostałeś gotowy kod, wystarczy odpowiednio użyć funkcji do operowania datą.
Soks
Ale czy ma sens przechowywanie daty w bazie danych? Zamierzam daty ustawić tak by zmienna miała jedną wartość na tydzień i tak by było około 30 dat, czyli kod php będę edytował około raz na 7 miesięcy. Tym bardziej, że w tym kodzie, który mam zachowuję pełną swobodę przypisywania zmiennych określonej dacie, na czym właśnie mi zależało, a w kodzie, który mi podałeś zmienna przyjmuje wartość tylko dla jednego przedziału czasu. Jeszcze takie pytanie, czym różni się to w praktyce? Tym, że ten kod jest zoptymalizowany czy tylko funkcjonalnością, w tym sensie, żeby było łatwiej edytować?
Pilsener
Dziś 30 dat a jutro nie wiadomo ile, należy unikać przechowywania parametrów w kodzie PHP bo jest to niewygodne i niewydajne, program powinien dostać określone parametry i zwrócić jakiś wynik, pisząc kod w ten sposób za pół roku założysz następny topic z tematem "jak zmienić ten kod?". Dorobienie jakiegoś panelu administracyjnego do takiego skryptu jest niemal niemożliwe.

I żaden problem lekko zmodyfikować kod, który podałem:
  1. $dane[1] = array(0,10,23);
  2. $dane[2] = array(11,20,56);
  3. $dane[3] = array(21,30,78);
  4.  
  5. $parametr = 25; //wartość wejściowa, może być Twoja data
  6.  
  7. foreach($dane as $index => $wartosc){
  8. list($min,$max,$zmienna) = $wartosc;
  9. if($parametr>=$min && $parametr<$max){
  10. $przedzial[0] = $index;
  11. $przedzial[1] = $zmienna;
  12. break;
  13. }
  14. }
  15. print_r($przedzial;)
- by zwracał nie tylko numer przedziału, lecz także liczbę 23 czy 56 (lub co zechcesz). Nie trzeba trzymać parametrów w bazie, można w pliku (nawet pliku .php), nakazu nie ma.

Wyobrażasz sobie skrypt, gdzie zamiast pliku konfiguracyjnego zmienne są "pozaszywane" w plikach z kodem PHP? Oddzielanie algorytmu od danych wejściowych jest powszechnie stosowaną praktyką. Na co komu skrypt, którego tylko autor umie używać (a i to tylko wtedy, dopóki nie zapomni co tam było)? Prędzej czy później trafi do kosza, już po 2-3 miesiącach zapomnisz zupełnie co kiedyś napisałeś, dlatego warto to robić zgodnie ze sztuką.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.