Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z wykresem
Forum PHP.pl > Forum > Przedszkole
miras
Witam, mam skrypt, który zlicza ilość graczy z serwera w danych godzinach i potem na podstawie tych danych generuje wykres, wszystko działa - problem pojawia się gdy wszystkie wartości są takie same - czyli np. 1, 1, 1, 1, 1, 1, 1 itp.

Błąd jaki mi wyrzuca to Division by zero - dzielenie przez zero czy coś w tym stylu.


błędy w linijkach: 32, 40, 62

  1. <?php
  2. class LabChartsLine extends LabCharts {
  3.  
  4. private $min;
  5. private $max;
  6.  
  7. public function __construct () {
  8. $this->_type = 'lc';
  9. $this->_colors = 'FAAC02';
  10. $this->_size = '300x150';
  11. }
  12. protected function dataToString ($data) {
  13. $str = 't:';
  14. $this->max = max($data);
  15. $this->min = min($data);
  16.  
  17. foreach ($data as $value) {
  18. if ($this->max != $this->min) {
  19. $newValue = round((1 - ($this->max - $value) / ($this->max - $this->min)) * 100, 3);
  20. $str .= $newValue . ',';
  21. } else {
  22. $newValue = round($this->max * 100, 3);
  23. $str .= $newValue . ',';
  24. }
  25. }
  26. return substr($str, 0, -1);
  27. }
  28.  
  29. public function setAxis ($rangeY, $labelsX) {
  30. if ($this->max != $this->min) {
  31. $newRange = round($rangeY / ($this->max - $this->min) * 100, 3);
  32. } else {
  33. $newRange = round($this->min * 100, 3);
  34. }
  35. $strLabels = '0:';
  36. $strPosition = '0';
  37. for ($a = $this->getFirstOfRange($rangeY); $a <= $this->max; $a += $rangeY) {
  38. $strLabels .= '|' . $a;
  39. }
  40. for ($a = $this->getFirstGrid($rangeY); $a <= 100; $a += $newRange) {
  41. $strPosition .= ',' . $a;
  42. }
  43. $this->_axis = 'y,x';
  44. $this->_axisRange = $strLabels . '|1:|' . $labelsX;
  45. $this->_axisPosition = $strPosition;
  46. }
  47.  
  48. public function setGrids ($rangeY) {
  49. if ($this->max != $this->min) {
  50. $newRangeY = round($rangeY / ($this->max - $this->min) * 100, 3);
  51. $newRangeX = round(100 / (count($this->baseData) - 1), 2);
  52. } else {
  53. $newRangeY = round($rangeY / $this->min * 100, 3);
  54. $newRangeX = round(100 / (count($this->baseData) - 1), 2);
  55. }
  56. $this->_grids = $newRangeX . ',' . $newRangeY . ',3,3,0,' . $this->getFirstGrid($rangeY);
  57. }
  58.  
  59. private function getFirstGrid($rangeY) {
  60. if ($this->max != $this->min) {
  61. return round((1 - ($this->max - $this->getFirstOfRange($rangeY)) / ($this->max - $this->min)) * 100, 3);
  62. } else {
  63. return round((1 - ($this->max - $this->getFirstOfRange($rangeY)) / $this->min) * 100, 3);
  64. }
  65. }
  66.  
  67. private function getFirstOfRange($rangeY){
  68. for ($pierwszyPodzielny = $this->min; $pierwszyPodzielny <= $this->max; $pierwszyPodzielny++){
  69. if (abs($pierwszyPodzielny) % $rangeY == 0 || $pierwszyPodzielny == 0)
  70. break;
  71. }
  72. return $pierwszyPodzielny;
  73. }
  74.  
  75. }
  76.  
  77. ?>
  78.  



mógłby ktoś mi podpowiedzieć jak temu zaradzić ? jeżeli wszystkie wartości są takie same to na wykresie powinna się pojawić pozioma linia i tyle.

Dzięki z góry!
modern-web
Skoro dzielisz przez 0 to nic dziwnego. Sprawdzaj przed tym działaniem, i zastosuj ew. inną ścieżkę gdy jest zero. Np. zwróć zero.
Nie mam opcji żeby to przetestować a na sucho to tylko tak pomogę.
miras
http://wklej.org/hash/4dc7821c9ab/ - LabChartsLine.php
http://wklej.org/hash/85888410f8a/ - LabCharts.php
http://wklej.org/hash/116a9712ac2/ - wykonanie..

próbowałem już na różne sposoby, ale głupoty w wykresie potem wychodzą. tu są wszystkie pliki, które są potrzebne do odpalenia, będę niezmiernie wdzięczny za jakieś wskazówki.
Turson
Jeżeli dzielnik jest zerem rzucaj wyjątek i po kłopocie.
miras
Sprawa załatwiona, w ten sposób to rozwiązałem smile.gif


  1. private function getFirstGrid($rangeY) {
  2. if (($this->max - $this->min)>0) { $dz = ($this->max - $this->min); } else { $dz=1; }
  3. return round((1 - ($this->max - $this->getFirstOfRange($rangeY)) / ($dz)) * 100, 3);
  4. }



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.