Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrócenie kodu
Forum PHP.pl > Forum > PHP
MenTo(S)
Witam, potrzebuje skrócić poniższy kod sam sobie jakoś nie mogę z tym poradzić.
Z góry dzięki za pomoc.
  1. $i = 121;
  2. $i2 = 107;
  3. $i3 = 91;
  4. $i4 = 76;
  5. $i5 = 61;
  6. $i6 = 47;
  7. $i7 = 31;
  8. $i8 = 17;
  9. $i9 = 0;
  10.  
  11. if($value1 < 0){
  12. $wysokosc1 = $i9;
  13. }
  14. if($value1 > 0){
  15. $wysokosc1 = $value1*0.34;
  16. }
  17. if($value1 > 50){
  18. $wysokosc1 = $i8;
  19. }
  20. if($value1 > 51){
  21. $wysokosc1 = $value1*0.28;
  22. }
  23. if($value1 > 100){
  24. $wysokosc1 = $i7;
  25. }
  26. if($value1 > 101){
  27. $wysokosc1 = $value1*0.32;
  28. }
  29. if($value1 > 150){
  30. $wysokosc1 = $i6;
  31. }
  32. if($value1 > 151){
  33. $wysokosc1 = $value1*0.32;
  34. }
  35. if($value1 > 200){
  36. $wysokosc1 = $i5;
  37. }
  38. if($value1 > 201){
  39. $wysokosc1 = $value1*0.3;
  40. }
  41. if($value1 > 250){
  42. $wysokosc1 = $i4;
  43. }
  44. if($value1 > 251){
  45. $wysokosc1 = $value1*0.3;
  46. }
  47. if($value1 > 300){
  48. $wysokosc1 = $i3;
  49. }
  50. if($value1 > 301){
  51. $wysokosc1 = $value1*0.3;
  52. }
  53. if($value1 > 350){
  54. $wysokosc1 = $i2;
  55. }
  56. if($value1 > 351){
  57. $wysokosc1 = $value1*0.3;
  58. }
  59. if($value1 > 399){
  60. $wysokosc1 = $i;
  61. }
ctom
może tak ...


Kod
$range =array(0 =>  $value1*0.34,
            50    =>    17 , // $i8
            51    =>    $value1*0.28,
            100    =>    31, // $i7
            //.....i tak dalej
            );
            
if($value1 < 0 ) {    
    $wysokosc1 = 0; // $i9
}
else {
    foreach($range as $k=>$v){
        if($value1 > $k) $wysokosc1 = $v;
    }
}
Michael2318
Pętla for, mnożniki tylko musisz zapisać jeszcze do tablicy.
SmokAnalog
Ale paskudne kodzisko. Kod spaghetti pełną gębą.

Zacznij od nazwania zmiennych po ludzku, bo jakoś nie wiem co to jest $value1 czy $i5. Pomysł kolegi ctom jest dobry, ale ja bym poszedł o krok dalej. Jak widać w tych warunkach występuje inna wartość dla równości (mimo, że zapisanej jako >). Wartości równe tym przedziałowym otrzymują wysokość jako wartość stałą, a wszystkie pośrodku jako iloczyn $value1 (aha!) i jakiejś stałej. Uwzględniłbym tę zależność w projektowaniu tablicy rang, nadając jej kształt na zasadzie:

  1. $range = array(
  2. // ...
  3.  
  4. 101 => array(
  5. 'fixed' => 31,
  6. 'multiplier' => 0.32
  7. ),
  8.  
  9. // ...
  10. );


Ale najpierw napisz co ten potwór robi.
MenTo(S)
W sumie fakt nie napisałem co za zadanie ma spełniać kod który wrzuciłem.
Otóż chodzi o to że jeżeli $wartosc ktora jest przykładowo x > 101 wtedy wartość $wysokosc ma byc $value*0.3 czyli 100*0.3.
Wtedy $wysokosc okresla mi wysokosc danego <div>.
Jako że jestem początkującym zrobiłem to jak zrobiłem ale działało smile.gif.

Reasumując używając tego co podrzucił ctom niezbyt chce to działać.

  1. $range = array(0 => $value2*0.34, 50 => 17, 51 => $value2*0.28,
  2. 100 => 31, 101 => $value2*0.32, 150 => 17, 151 => $value2*0.32,
  3. 200 => 61, 201 => $value2*0.3, 250 => 76, 251 => $value2*0.3,
  4. 300 => 91, 301 => $value2*0.3, 350 => 107, 351 => $value2*0.3,
  5. 400 => 121);
  6.  
  7. if($value2 < 0 ) {
  8. $wysokosc1 = null;
  9. } else {
  10. foreach($range as $k => $v){
  11. if($value2 > $k) $wysokosc1 = $v;
  12. }
  13. }




Słupek pierwszy to mój kod "spaghetti" snitch.gif
Natomiast drugi jest to kod który podrzucił właśnie ctom
SmokAnalog
Mam dziwne przeczucie, że to można zapisać w króciutkim wyrażeniu. Możesz dokładnie wytłumaczyć o co chodzi z $value1 i $value2?
MenTo(S)
$value1,2,3,4 w moim przypadku to będzie pobierana liczba osób z bazy danych.
SmokAnalog
Dlaczego wysokość rośnie tak nieregularnie, tzn. raz o 14px, raz o 15px, raz o 16px w ramach jednego przedziału? Czy to zaniedbanie czy jakieś celowe działanie? Bo coś mi się wydaje, że wystarczyłoby to zapisać jednym wyrażeniem arytmetycznym.
MenTo(S)
Cytat(SmokAnalog @ 1.08.2014, 12:29:45 ) *
Dlaczego wysokość rośnie tak nieregularnie, tzn. raz o 14px, raz o 15px, raz o 16px w ramach jednego przedziału? Czy to zaniedbanie czy jakieś celowe działanie? Bo coś mi się wydaje, że wystarczyłoby to zapisać jednym wyrażeniem arytmetycznym.

Tak to zaniedbanie zapewne to poprawie co do kodu może rosnąc równomiernie dla każdego przedziału.
SmokAnalog
Najładniej byłoby określić maksymalną możliwą wysokość słupka i maksymalną liczbę użytkowników widoczną na wykresie, np.:
  1. $maxUsers = 500;
  2. $maxHeight = 300;


I potem na podstawie liczby użytkowników (dajmy na to $users), nadawać słupkowi odpowiednią wysokość, np.:
  1. $height = round($users * $maxHeight / $maxUsers);
MenTo(S)
Cytat(SmokAnalog @ 1.08.2014, 12:46:24 ) *
Najładniej byłoby określić maksymalną możliwą wysokość słupka i maksymalną liczbę użytkowników widoczną na wykresie, np.:
  1. $maxUsers = 500;
  2. $maxHeight = 300;


I potem na podstawie liczby użytkowników (dajmy na to $users), nadawać słupkowi odpowiednią wysokość, np.:
  1. $height = round($users * $maxHeight / $maxUsers);


Nie przypuszczałem że można zrobić to takim krótkim kodem smile.gif
Dzięki wielkie.
ctom
Cytat(MenTo(S) @ 1.08.2014, 12:17:06 ) *
Reasumując używając tego co podrzucił ctom niezbyt chce to działać.


kod po refaktoryzacji zwraca wyniki z założeń , a to że miałeś w nich błędy oraz kwestia co z nimi robiłeś później to już inna sprawa

AmbitnyCzłowiek
Wykresy rysujesz w phpie? Nie prościej użyć jakiejś biblioteki js? Z własnego doświadczenia polecam Chart.js, dobrze współpracuje z JSON'em.
SmokAnalog
Cytat(AmbitnyCzłowiek @ 6.08.2014, 10:19:46 ) *
Nie prościej użyć jakiejś biblioteki js? Z własnego doświadczenia polecam Chart.js, dobrze współpracuje z JSON'em.

Biblioteka JS współpracuje z JSON-em? A po co?
AmbitnyCzłowiek
robisz arraya z danymi i potem tylko echujesz to smile.gif
SmokAnalog
Nie mam pojęcia o co Ci chodzi. W JavaScript nie ma nic takiego jak echowanie.
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.