Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Funkcja IF Jak skrócić...
michal_macieja
post
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 31.12.2009
Skąd: Warszawa

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


Witajcie, znów mam głupie pytanie...
Mam w funkcji takie coś:

  1. echo "<table>";
  2. echo "<tr><td><a href='show.php?site=$id_n'><img src='$zdje'width='240' height='180' title='$opis1'></a></td></tr>";
  3. echo "<tr><td><b><so1>$opis</so1></b> </td></tr>";
  4. echo "<tr><td><b><sc1>Run time:</b> $czas</sc1> </td></tr>";
  5. echo "</table>";
  6.  
  7. if($ile==4 or $ile==8 or $ile==12 or $ile==16 or $ile==20 or $ile==24 or $ile==28 or $ile==32 or $ile==36 or $ile==40
  8. or $ile==44 or $ile==48 or $ile==52 or $ile==56 or $ile==60 or $ile==64 or $ile==68 or $ile==72 or $ile==76 or $ile==80
  9. or $ile==84 or $ile==88 or $ile==92 or $ile==96)
  10. {echo"</td></tr><tr><td>";} else {echo "</td><td>";}
  11. $ile++;


A teraz pytanie
Jak mogę to skrócić, albo jak napisać inną funkcję by była odpowiedzialna za pisanie tych warunków w (if). Bo nie mogę ich ustalić raz, bo są one zmienne(w zależności ile wyników wybierze ktoś tyle się będzie wyświetlać), czy jest możliwość by to zrobić jak tak czy ktoś może podpowiedzieć mi.
Go to the top of the page
+Quote Post
Wicepsik
post
Post #2





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


  1. if($ile % 4 == 0){ echo 'cos'; }else{ echo 'cos2'; }


http://php.net/manual/en/language.operators.arithmetic.php

Ten post edytował Wicepsik 13.01.2010, 23:57:30
Go to the top of the page
+Quote Post
lukaszgolder
post
Post #3





Grupa: Zarejestrowani
Postów: 141
Pomógł: 17
Dołączył: 2.04.2008
Skąd: z Zabrza

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


No i jeszcze
  1. && $ile > 0 && $ile < 100
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


albo:
  1. $s = range(4,96,4); // od 4 do 96 co 4
  2. if(in_array($ile, $s)) {
  3. echo"</td></tr><tr><td>";
  4. }
  5. else {
  6. echo "</td><td>";
  7. }
  8. $ile++;

~Wicepsik Twoja koncepcja operuje na wszystkich liczbach podzielnych bez reszty przez 4, a autorowi tematu chodziło raczej o przykładowy i jakoś tam później ustalany przedział (4-96 co 4)
// edit
\/ @down aa, chyba, że tak (IMG:style_emoticons/default/winksmiley.jpg)

Ten post edytował darko 14.01.2010, 00:44:07
Go to the top of the page
+Quote Post
michal_macieja
post
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 31.12.2009
Skąd: Warszawa

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


Dzięki Wicepsik za Pomoc, dokładnie o to mi chodziło, a że działa na całym przedziale liczbowym to mi nie przeszkadza, jeszcze lepiej dla mnie.
Bo nie będę musiał pisać kolejnych linijek kodu do tego przy funkcji z wyborem ilości wyświetlanych filmów.

A teraz mam bardziej zawiłą funkcję if (IMG:style_emoticons/default/smile.gif) I teraz znów to samo pytanie jakim sposobem mogę to zmniejszyć.

  1. if($nr1<=499) {$fo = 'mov/1/0/';} else if($nr1>= 500 && $nr1<= 999) {$fo = 'mov/1/1/';}
  2. else if($nr1>= 1000 && $nr1<= 1499) {$fo = 'mov/1/2/';} else if($nr1>= 1500 && $nr1<= 1999) {$fo = 'mov/1/3/';}
  3. else if($nr1>= 2000 && $nr1<= 2499) {$fo = 'mov/1/4/';} else if($nr1>= 2500 && $nr1<= 2999) {$fo = 'mov/1/5/';}
  4. else if($nr1>= 3000 && $nr1<= 3499) {$fo = 'mov/1/6/';} else if($nr1>= 3500 && $nr1<= 3999) {$fo = 'mov/1/7/';}
  5. else if($nr1>= 4000 && $nr1<= 4499) {$fo = 'mov/1/8/';} else if($nr1>= 4500 && $nr1<= 4999) {$fo = 'mov/1/9/';}
  6. else if($nr1>= 5000 && $nr1<= 5499) {$fo = 'mov/2/0/';} else if($nr1>= 5500 && $nr1<= 5999) {$fo = 'mov/2/1/';}
  7. else if($nr1>= 6000 && $nr1<= 6499) {$fo = 'mov/2/2/';} else if($nr1>= 6500 && $nr1<= 6999) {$fo = 'mov/2/3/';}
  8. else if($nr1>= 7000 && $nr1<= 7499) {$fo = 'mov/2/4/';} else if($nr1>= 7500 && $nr1<= 7999) {$fo = 'mov/2/5/';}
  9. else if($nr1>= 8000 && $nr1<= 8499) {$fo = 'mov/2/6/';} else if($nr1>= 8500 && $nr1<= 8999) {$fo = 'mov/2/7/';}
  10. else if($nr1>= 9000 && $nr1<= 9499) {$fo = 'mov/2/8/';} else if($nr1>= 9500 && $nr1<= 9999) {$fo = 'mov/2/9/';}
  11. else if($nr1>=10000 && $nr1<=10499) {$fo = 'mov/3/0/';} else if($nr1>=10500 && $nr1<=10999) {$fo = 'mov/3/1/';}
  12. else if($nr1>=11000 && $nr1<=11499) {$fo = 'mov/3/2/';} else if($nr1>=11500 && $nr1<=11999) {$fo = 'mov/3/3/';}
  13. else if($nr1>=12000 && $nr1<=12499) {$fo = 'mov/3/4/';} else if($nr1>=12500 && $nr1<=12999) {$fo = 'mov/3/5/';}
  14. else if($nr1>=13000 && $nr1<=13499) {$fo = 'mov/3/6/';} else if($nr1>=13500 && $nr1<=13999) {$fo = 'mov/3/7/';}
  15. else if($nr1>=14000 && $nr1<=14499) {$fo = 'mov/3/8/';} else if($nr1>=14500 && $nr1<=14999) {$fo = 'mov/3/9/';}
  16. else if($nr1>=15000 && $nr1<=15499) {$fo = 'mov/4/0/';} else if($nr1>=15500 && $nr1<=15999) {$fo = 'mov/4/1/';}
  17. else if($nr1>=16000 && $nr1<=16499) {$fo = 'mov/4/2/';} else if($nr1>=16500 && $nr1<=16999) {$fo = 'mov/4/3/';}
  18. else if($nr1>=17000 && $nr1<=17499) {$fo = 'mov/4/4/';} else if($nr1>=17500 && $nr1<=17999) {$fo = 'mov/4/5/';}
  19. else if($nr1>=18000 && $nr1<=18499) {$fo = 'mov/4/6/';} else if($nr1>=18500 && $nr1<=18999) {$fo = 'mov/4/7/';}
  20. else if($nr1>=19000 && $nr1<=19499) {$fo = 'mov/4/8/';} else if($nr1>=19500 && $nr1<=19999) {$fo = 'mov/4/9/';}
  21. else if($nr1>=20000 && $nr1<=20499) {$fo = 'mov/5/0/';} else if($nr1>=20500 && $nr1<=20999) {$fo = 'mov/5/1/';}
  22. else if($nr1>=21000 && $nr1<=21499) {$fo = 'mov/5/2/';} else if($nr1>=21500 && $nr1<=21999) {$fo = 'mov/5/3/';}
  23. else if($nr1>=22000 && $nr1<=22499) {$fo = 'mov/5/4/';} else if($nr1>=22500 && $nr1<=22999) {$fo = 'mov/5/5/';}
  24. else if($nr1>=23000 && $nr1<=23499) {$fo = 'mov/5/6/';} else if($nr1>=23500 && $nr1<=23999) {$fo = 'mov/5/7/';}
  25. else if($nr1>=24000 && $nr1<=24499) {$fo = 'mov/5/8/';} else if($nr1>=24500 && $nr1<=24999) {$fo = 'mov/5/9/';}
  26. else if($nr1>=25000 && $nr1<=25499) {$fo = 'mov/6/0/';} else if($nr1>=25500 && $nr1<=25999) {$fo = 'mov/6/1/';}
  27. else if($nr1>=26000 && $nr1<=26499) {$fo = 'mov/6/2/';} else {$fo = 'mov/6/3/';};
Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To popatrz jak się zmieniają liczby na litość boską (IMG:style_emoticons/default/winksmiley.jpg)
mov/1/X od 0 do 4999
mov/2/x od 5000 do 9999
Tak wyłapujesz katalog nadrzędny.
Podrzędne masz analogicznie, tyle że na zakresach 10 razy mniejszych... no i mają start nie od 1 ale od 0
mov/1/0 od 0 do 499
mov/1/1 od 500 do 999
Tak więc robisz dzielenie liczb przez 5000 zaokrąglasz w dół i dodajesz 1. A potem resztę z tego działania dzielisz przez 500 i zaokrąglasz tylko w dół.

Przykład? Liczba 7645:
7645/5000 = 1,529 = 1+1 = 2
2645/500 = 5,29 = 5
Sprawdzamy Twoje IFy ma wyjść mov/2/5/
A co mi wyszło? 2 oraz 5.

Sprawdźmy dla granicznych dla pewności...
4999/5000 = 0,9998 = 0+1 = 1
4999/500 = 9,998 = 9
1/9 -> Prawidłowe!

5000/5000 = 1+1 = 2
0/500 = 0
2/0 -> Prawidłowe!

Jak widzisz... Ten skrypt jest mocno do przodu bo już potrafi operować na 9/9, co u Cienie skończy się przy $nr1 = 49999, a Ty dopiero masz 6/3 skryptem przewidziane (IMG:style_emoticons/default/winksmiley.jpg)

Poucz się więcej matmy a nie siedź tylko przed kompem (IMG:style_emoticons/default/biggrin.gif)

EDIT: Popatrz zresztą na wyniki dzieleń... Są 10 razy mniejsze! To znów ułatwienie bo nie musisz wcale liczyć reszty z dzielenia przez 5000, mogąc to zastąpić odejmowaniem. Bierzesz liczbę i dzielisz ja przez 5000. Do całości dodajesz 1, a ułamek mnożysz razy 10 i zaokrąglasz w dół.

Owe 7645 przerobię raz jeszcze:
7645/5000 = 1,529 = 1+1=2
0,529*10 = 5,29 = 5
Nie banalniejsze?
  1. $liczba = $nr1/5000;
  2. $kat1 = floor( $liczba );
  3. $kat2 = floor( ($liczba - $kat1)*10 );
  4. //można też zamiast ($liczba - $kat1) dać fmod($liczba, 5000) czy $liczba%5000, ale odejmowanie powinno być szybsze niż modulo.
  5. $fo = 'mov/'.($kat1+1).'/'.$kat2.'/';

Co jest krótsze i wydajniejsze? (IMG:style_emoticons/default/winksmiley.jpg) 3 linijki czy 100 operacji if else (IMG:style_emoticons/default/winksmiley.jpg)

Ten post edytował thek 17.01.2010, 00:09:49
Go to the top of the page
+Quote Post
michal_macieja
post
Post #7





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 31.12.2009
Skąd: Warszawa

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


thek
Dzięki za odpowiedz, a z matmą u mnie nie jest źle...
Lecz po skończeniu szkoły 3 lata temu i wskoczeniu w wir pracy(w profesji elektryka), zapomina się powoli wszystkiego.

Jeszcze raz dzia.
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: 28.09.2025 - 04:43