Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja IF Jak skrócić...
Forum PHP.pl > Forum > Przedszkole
michal_macieja
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.
Wicepsik
  1. if($ile % 4 == 0){ echo 'cos'; }else{ echo 'cos2'; }


http://php.net/manual/en/language.operators.arithmetic.php
lukaszgolder
No i jeszcze
  1. && $ile > 0 && $ile < 100
darko
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 winksmiley.jpg
michal_macieja
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 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/';};
thek
To popatrz jak się zmieniają liczby na litość boską 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 winksmiley.jpg

Poucz się więcej matmy a nie siedź tylko przed kompem 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? winksmiley.jpg 3 linijki czy 100 operacji if else winksmiley.jpg
michal_macieja
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.
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.