Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHP problem [f. if], PHP problem z funkcją if(); i date();
andrzejt17
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Witam,

Piszę w PHP skrypt, który oblicza różnicę czasu w minutach od daty zapisanej w ciastku a daty aktualnej. W ten sposób otrzymuje wynik ile czasu pozostało do 'czegoś'. Wynik przedstawiam tak:
Pozostało np. 25 minut.
Jednak co wyświetlić, jeśli pozostało 2 minuty ? (zmiana 'minut' <-> 'minuty') W tym celu piszę skrypt, który odczytuje ilość czsu który pozostał, porównuje go z odpowiednią wartością i zwaraca wynik w postaci 'minut' || 'minuty' || 'minuta'. Tutaj zaczyna się cały problem ponieważ chcę wartość "przerobionej" funkcji date(); porównać do liczby. Jeśli pozostało np 25 minut ma wyświetlić wyraz "minut" a nie minuty czy minuta. A z tego co widze to jest to niemożliwe. Pytanie więc jak przedstawić wartość date("i") za pomocą liczby, żebym mógł ją porównać do jakieś liczby, zeby skrypt mógł się wykonać (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Lub w ogóle jakieś inne rozwiązanie pochodne tego co próbuję tu stworzyć (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

  1. <?php
  2. if (date("i") == 25)
  3. {
  4. $text = minut;
  5. }
  6. else if(date("i") == 2)
  7. {
  8. $text = minuty;
  9. } else {}
  10. ?>


Może troszkę zamotałem ale nie potrafie tego ogarnąć (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Jeśli ktoś chce mogę wrzucić ten kawałek kodu gdzie to usiłuje zrobić. Proszę o jakąś wskazówkę bo sam nie daje rady z tym problemem (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Pozostało 24 min.
Pozostało 29 min.
Pozostało 1 min.

Działa? Działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Trochę inaczej:
  1. <?php
  2. // $m - liczba minut
  3. $j = $m % 10; // jedności
  4. $s = 'minut';
  5.  
  6. if($m == 1) $s = 'minuta';
  7. // tu jeszcze jeden warunek na liczby 10-20 - sam wykombinuj
  8. elseif($s < 5) $s = 'minuty';
  9.  
  10. echo $m . ' ' . $s;
  11. ?>
Go to the top of the page
+Quote Post
ShadowD
post
Post #3





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

Ostrzeżenie: (0%)
-----


Nie rozumiem prawie nic, ale z tego co podałeś to:

  1. <?php
  2. if(date("i")==0)
  3.   $text = minut;
  4. elseif (date("i") <= 1)
  5.   $text = minuta;
  6. else if(date("i") <= 4 || date("i") > 51 && date("i") < 55)
  7.   $text = minuty;
  8. else
  9.   $text = minut;
  10. ?>


Edit:
To jest ok jeśli zakładamy, że po 60 min będziemy zamieniali na godziny. ;]

Ten post edytował ShadowD 25.06.2009, 00:41:52
Go to the top of the page
+Quote Post
andrzejt17
post
Post #4





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Dobra jakoś wspólnie wykombinowaliśmy z innym forumowiczem...

  1. <?php
  2. if(date("i") === '25') ...
  3. else if(date("i") === '02') ...
  4. ?>


i to wszystko rozwiązuje. Tak przy okazji mam jeszcze jedno pytanie. Mam napisaną funkcję if(); wyglądającą jak tasiemiec... da się to jakość skrócić używająć jakieś alternatywnej metody? czy tam pętli (o ile to możliwe)..

  1. <?php
  2. /* w zmiennej $r0 istnieje działanie wyliczające różnicę między datami w postaci "rozebranych" dat za pomocą strtotime(); */
  3. $rx = date("i", $r0);  // składa datę i pokazuje czs pozostały w minutach
  4.  
  5. $rtxa = minut;
  6. $rtxb = minuty;
  7. $rtxc = minuta;
  8.  
  9. if(($rx === '30') || ($rx === '29') || ($rx === '28') || ($rx === '27') || ($rx === '26') || ($rx === '25') || ($rx === '21') || ($rx === '20') || ($rx === '19') || ($rx === '18') || ($rx === '17') || ($rx === '16') || ($rx === '15') || ($rx === '14') || ($rx === '13') || ($rx === '12') || ($rx === '11') || ($rx === '10') || ($rx === '9') || ($rx === '8') || ($rx === '7') || ($rx === '6') || ($rx === '5'))
  10.  {
  11.  $rxt = $rtxa;
  12.  }
  13. else if(($rx === '24') || ($rx === '23') || ($rx === '22') || ($rx === '4') || ($rx === '3') || ($rx === '2'))
  14.  {
  15.  $rxt = $rtxb;
  16.  }
  17. else if($rx === '1')
  18.  {
  19.  $rxt = $rtxc;
  20.  }
  21. else {}
  22. ?>
Go to the top of the page
+Quote Post
ShadowD
post
Post #5





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

Ostrzeżenie: (0%)
-----


Np: if($liczba > 2 && $liczba < 10) by nie wymieniać 10 liczb, jeszcze można switch ale przedział to lepsza metoda.

Edit: to co poprawiłem na górze działa właśnie tak jak twoje tylko na przedziałach...

Edit2: Po co Ci pusta instrukcja ELSE i dlaczego porównujesz liczby z ciągami?

Ten post edytował ShadowD 25.06.2009, 00:47:18
Go to the top of the page
+Quote Post
andrzejt17
post
Post #6





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Dzięki panowie, nie pomyślałem o przedziałach liczbowych. Generalnie udało mi się skrócić funkcję do takiej postaci:

  1. <?php
  2. if(($rx < '31') && ($rx > '24') || ($rx < '22') && ($rx > '04'))
  3.  {
  4.  $rxt = $rtxa;
  5.  }
  6. else if(($rx < '25') && ($rx > '21') || ($rx < '05') && ($rx > '01'))
  7.  {
  8.  $rxt = $rtxb;
  9.  }
  10. else if($rx === '01')
  11.  {
  12.  $rxt = $rtxc;
  13.  }
  14. ?>


Pozbylem się pustej 'else'. Miło, że jak się tworzy o tej porze i potrzebuje się porady na forum to ktoś nie śpi i pomoże ;D

I żeby nie było nudno jeszcze jedno pytanie: dlaczego jesli pozostał czas od 9 minut do 1 to date(); zwraca wartość 09, 08 ... 01 ? a nie 9, 8, ... 1 ? ;> Da się to jakoś zmodyfikować ? Właściwie to mi to nie przeszkadza, że wyświetla 06 minut a nie 6 minut ale zawsze jakieś doświadczenie więcej (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

EDIT:
zorientowałem się, że przedzieły liczb są nieprawidłowe więc zmodyfikowałem powyższy kod zmieniając wielkości przedziałów.

EDIT 2:
Jak by wyglądała ta funkcja (mam na myśli wersję tasiemcową) za pomocą swith ? Nigdy się jeszcze z tym nie bawiłem bo nie miałem potrzeby (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował andrzejt17 25.06.2009, 01:12:34
Go to the top of the page
+Quote Post
ShadowD
post
Post #7





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

Ostrzeżenie: (0%)
-----


Jakoś tak się przyjęło, że godzinę podajemy np. 12:05 a nie 12:5...

Możesz pomnożyć przez jeden powinno dać to zamierzony rezultat. ;]

A poza tym można by to napisać np tak:
  1. <?php
  2. $rx=$rx*1;
  3.  
  4. if($rx < 31 && $rx > 24 || $rx < 22 && $rx > 4)
  5.    $rxt = $rtxa;
  6. elseif($rx < 25 && $rx > 21 || $rx < 5 && $rx > 1)
  7.    $rxt = $rtxb;
  8. elseif($rx == 1)
  9.    $rxt = $rtxc;
  10. ?>


Ten post edytował ShadowD 25.06.2009, 01:13:47
Go to the top of the page
+Quote Post
andrzejt17
post
Post #8





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Przetestuje mnożenie (IMG:http://forum.php.pl/style_emoticons/default/haha.gif)

a co do kodu... nie zadziała. Nie da rady porównać wynik date("i"); z liczną czy przedziałem bez ''

Musiałby wyglądać tak:

  1. <?php
  2. $rx=$rx*1; // niewiem jak w tym wypadku ale się dowiem
  3.  
  4. if($rx < '31' && $rx > '24' || $rx < '22' && $rx > '4')
  5.   $rxt = $rtxa;
  6. elseif($rx < '25' && $rx >'21' || $rx < '5' && $rx > '1')
  7.   $rxt = $rtxb;
  8. elseif($rx == '1')
  9.   $rxt = $rtxc;
  10. ?>


ponad to używanie === zamiast == przyspiesza wykonywanie kodu (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Nieznacznie co prawda (w wypadku kilku poleceń) ale przyspiesza ;P (przy większej ilości poleceń zauważalna różnica (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) )
Go to the top of the page
+Quote Post
ShadowD
post
Post #9





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

Ostrzeżenie: (0%)
-----


Mnożenie zamienia ciąg na liczbę, więc porównanie liczb będzie szybsze niż ciągów, więc nie musisz używać ' ani " jak już się tak prędkości czepiamy. (IMG:http://forum.php.pl/style_emoticons/default/haha.gif)
Go to the top of the page
+Quote Post
andrzejt17
post
Post #10





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Niestety mnożenie nie zdało egzaminu ponad to prze przedziałach nie musiałbym używać ' ani " pod warunkiem, że do przedziału wstawiał bym liczbę a ja wstawiam ciąg (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) więc muszę używać ' nie mniej jednak w wypadku mnożenia można sobie darować (IMG:http://forum.php.pl/style_emoticons/default/haha.gif)

Jest jeszcze jakaś alternatywa sposobu mnożenia ? Żeby było jasno zamiast np 09 to 9 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

EDIT:

jednak działa (IMG:http://forum.php.pl/style_emoticons/default/haha.gif) Dziękówa (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował andrzejt17 25.06.2009, 01:35:28
Go to the top of the page
+Quote Post
ShadowD
post
Post #11





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

Ostrzeżenie: (0%)
-----


  1. <?php
  2.   $t='0000002';
  3.  
  4.   if($t==2)
  5.      echo 'Brawo - dziala! ('.$t.')<br />';
  6.  
  7.   $t=$t*1;
  8.  
  9.   echo '('.$t.')';
  10. ?>


Wynikiem jest:

Kod
Brawo - dziala! (0000002)
(2)

*Przetestowane

Co oznacza, że możemy porównywać ciąg o wartości '02' z liczbą 2. A mnożenie przez jeden usuwa wszystkie pierwsze zera.

I tyle, bo IRCa z forum robimy.

Ten post edytował ShadowD 25.06.2009, 01:42:14
Go to the top of the page
+Quote Post
andrzejt17
post
Post #12





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


LooL ...

  1. <?php
  2. $data_o = "00:02:00";  
  3. $data_1 = strtotime($data_o);  
  4. $new_date = date("i", $data_1);
  5.  
  6.  $t=$new_date;
  7.  
  8.  if($t==2)
  9.     echo 'Brawo - dziala! ('.$t.')<br />';
  10.  
  11.  $t=$t*1;
  12.  
  13.  echo '('.$t.')';
  14.  
  15. ?>


Teraz działa! A jak wtedy pisalem:

  1. <?php
  2. if(date("i") == 2) // to co pisałęm w 1 poście
  3. {
  4. $text = minuty;
  5. }
  6. ?>


to nie działało... ehh a przecież to na jedno wychodzi...

Tak czy inaczej prace nad skryptem i stroną idą dalej więc kij z tym (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Dzięki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

mo'sz'na zamknąć (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 15:52