skrypt wyświetlający przedziały jakich się brało substancje

0

Mam taki problem mam problem ze skryptem który wyświetla przedziały w jakich się brało substancje np tianesal się brało w dawkach 1 stycznia 2018 20 mg potem 2 stycznia 2018 roku w dawce 50 mg no i 3 stycznia 2018 roku w dawce 100 mg w i potem 2 lutego 2018 w dawce 30 mg to zadaniem tego skryptu było by
zrobienie czegoś takiego'
od 1 stycznia 2018 roku do do 3 stycznia 2018 roku dawka średnia to 65 mg
i od 2 lutego do 2 tutego 208 roku dawka średnia to 30 mg

Próbowałem nawet coś zrobić, ale mi nie wyszło.

public function oblicz_srednia() {
      $id_produkt = DB::select("select id_produktu from spozycie where id = " . Input::get('id') . "");
        foreach ($id_produkt as $id_produkt2) {}
       $produkt = DB::select("select nazwa,ile_procent,id from produkty where id = '" . $id_produkt2->id_produktu ."'");
       foreach ($produkt as $produkt2) {}
    
     $daty_produktow = DB::select("select sum(porcja) as porcja,year(data) as data1,month(data) as data2,day(data) as data3,id_produktu,cena from spozycie where  data < '2018-03-30' group by data1,data2,data3,id_produktu");
    $i = 0;
    $j = 0;
    $z = 0;
    $porcja = "";
    $tablica = array();
    foreach ($daty_produktow as $data_produktow2) {
         $tablica[$i][0] = $data_produktow2->data1;
         $tablica[$i][1] = $data_produktow2->data2;
         $tablica[$i][2] = $data_produktow2->data3;
         $tablica[$i][3] = $data_produktow2->porcja;
           if ($i != 0) {
             //$j = 0;
             if ($tablica[$i][0] == $tablica[$i-1][0] and $tablica[$i][1] == $tablica[$i-1][1] and $tablica[$i][2] == $tablica[$i][2] and $data_produktow2->id_produktu ==   $produkt2->id  ) {
	      //if ($j == 0) {
	        $data1[$z] = $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2];
	
	      //}
	     print $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  ."<br>";
	     $porcja += $tablica[$i][3];
	     $j++;
	      print $j;
         }
        else {
      
	  if ($j != 0) {
	   $porcja2[$z] = $porcja / $j;
	  }
	 $data2[$z] =  $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  ."<br>";
	 print  $j;
	$j = 0;
	$z++;
       }
       if ($tablica[$i][3] != $tablica[$i-1][3]) {
	  //print "dobrze";
         //$j++;
         }
      }
      
     $i++;
    }
    var_dump($data1);
    print count($data2);
    for ($z=2;$z < count($data2);$z++) {
       print $data1[$z] . "<br>".$data2[$z]  . "<br>". $porcja2[$z];
    }
    
    print $i . "<br>" . $j;
    
  }
0

Już prawie napisałem , ale dla niektórych substancji zwraca mi błąd.

taki błąd

Undefined offset: 10

I to są substancje, które nie są często brane.

A tutaj deje kod źródłowy

 public function oblicz_srednia() {
    $id_produkt = DB::select("select id_produktu from spozycie where id = " . Input::get('id') . "");
    foreach ($id_produkt as $id_produkt2) {}
    $produkt = DB::select("select nazwa,ile_procent,id from produkty where id = '" . $id_produkt2->id_produktu ."'");
    foreach ($produkt as $produkt2) {}
    
    $daty_produktow = DB::select("select sum(porcja) as porcja,year(data) as data1,month(data) as data2,day(data) as data3,id_produktu,cena from spozycie where  id_produktu ='" .  $id_produkt2->id_produktu  ."' and data < '2018-03-30' group by data1,data2,data3");
    $i = 0;
    $j = 0;
    $z = 0;
    $porcja = "";
    $tablica = array();
    $data1 = "";
    $status = false;
    foreach ($daty_produktow as $data_produktow2) {
      $tablica[$i][0] = $data_produktow2->data1;
      $tablica[$i][1] = $data_produktow2->data2;
      $tablica[$i][2] = $data_produktow2->data3;
      $tablica[$i][3] = $data_produktow2->porcja;
      //print $tablica[$i][2];
      if ($i != 0) {
      //$j = 0;
      
      if ($wynik = $tablica[$i][2] - $tablica[$i-1][2] != 1) {
      
      //$status
	//if ($j == 0) {
	$data1[$z] = $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2];
	print "dobrze";
	//}
	print $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  ."<br>";
	$porcja += $tablica[$i][3];
	$j++;
	//print $z;
	if ($status == true) {
	//$z++;
	}
	//print $z;
	//$z++;
	$z++;
      }
      else if ($wynik = $tablica[$i][2] - $tablica[$i-1][2] == 1) {
      
      print "gowno";
	if ($j != 0) {
	$porcja2[$z] = $porcja / $j;
	}
	//else $porcja2[$z] = $porcja;
	$data2[$z] =  $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  ."<br>";
	print  $j;
	$porcja = 0;
	$j = 0;
	
	if ($status == false) {
	//$z++;
	}
      }
      
      if ($tablica[$i][3] != $tablica[$i-1][3]) {
	//print "dobrze";
      //$j++;
      }
      }
      
    $i++;
    }
    //var_dump($data1);
    //if (!isset($data2)) {
      //$data2[$z] =  $tablica[$i-1][0] . "-" . $tablica[$i-1][1] . "-" . $tablica[$i-1][2]  ."<br>";
    //}
     
    //print count($porcja2);
    for ($z=0;$z < count($data1);$z++) {
    print $data1[$z] . "<br>".$data2[$z] . "<br>" . "<font color=red>";
    if ($z == count($data1)) print "<font color=red>" .  $porcja2[$z-1] . "</font>";
    else print "<font color=red>" .  $porcja2[$z+1] . "</font><br>";
    }
    
    print $i . "<br>" . $j;
    print "<br>" . $z;
    print "<br>" . count($data1) . "<br>";
    
  }

Sformatowałm u siebie w edytorze.

0

Już wiem w czym tkwi problem jak po przerobieniu tablicy i wstawieniu w niej wartości jak próbuje wydrukowac taką tablicę to pojawia się komunikat niezdefiniowany obiket jeden bo tak jest, że jak policzy wartośc jeden indeks tabeli to musi to skończyć indeksem tabeli dwa a tak nie jest i nie wiem jak to zrobić.

  public function oblicz_srednia() {
    $wspolne = new \App\Http\Controllers\wspolne();
    
    $id_produkt = DB::select("select id_produktu from spozycie where id = " . Input::get('id') . "");
    foreach ($id_produkt as $id_produkt2) {}
    $produkt = DB::select("select nazwa,ile_procent,id from produkty where id = '" . $id_produkt2->id_produktu ."'");
    foreach ($produkt as $produkt2) {}
    //zapytanie pobierające tylko 50 elementów i grupujące to według dnia 
    $daty_produktow = DB::select("select sum(porcja) as porcja,year(data) as data1,month(data) as data2,day(data) as data3,id_produktu,cena from spozycie where  id_produktu ='" .  $id_produkt2->id_produktu  ."' and data < '2018-03-30' group by data1,data2,data3 order by data limit 50");
    $i = 0;
    $j = 0;
     //zmienna potrzeba do juz przefiltrowanej tablicy
    $z = 0;
    $porcja = "";
    $tablica = array();
    $data1 = "";
    $status = "";
    $pierwsza = false;
    foreach ($daty_produktow as $data_produktow2) {
      $tablica[$i][0] = $data_produktow2->data1;
      $tablica[$i][1] = $data_produktow2->data2;
      $tablica[$i][2] = $data_produktow2->data3;
      $tablica[$i][3] = $data_produktow2->porcja;
      
      //print $tablica[$i][2];
      $stan = 0;
      $stan2 = 0;
      if ($i != 0) {
      //$j = 0;
       //liczba sekund które różnią  dla tera źniejszego rekordu
      $liczba_sekund1 = $wspolne->oblicz_liczbe_sekund($tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2] . " 05:00:00");
       //liczba sekund które różnią  dla starszego rekordu
      $liczba_sekund2 = $wspolne->oblicz_liczbe_sekund($tablica[$i-1][0] . "-" . $tablica[$i-1][1] . "-" . $tablica[$i-1][2] . " 05:00:00");
      print "<br>xxxxx" .  ($liczba_sekund1 - $liczba_sekund2)  . "xxxx".  $tablica[$i][2] . "<br>";
      //jeżeli rownica sekund w starszym rekordzie będzie większa niż dzien to znaczy, że był wiekszy odstep niż jeden dzień
      if (($wynik = $liczba_sekund1 - $liczba_sekund2 ) > 86400) {
      $wynik2 = 86400;
      }
      //else if (($wynik = $liczba_sekund1 - $liczba_sekund2 ) == 172800) {
      //$wynik2 = 172800;
      //}
      $wynik3= "";
      print $wynik;
      //jęzli był większy odstep niż jeden dzień
      if ($wynik  > $wynik2) {
      //$status = true;
      //$status
	//if ($j == 0) {
	//if ($stan == 0 or $stan == $stan2) {
	if ($status == true) {
	//$z++;
	
	  $data1[$z]['jeden'] = $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2];
	  $stan++;
	  $status =  false;
	  $pierwsza = true;
	  print "dobrze";
	  }
	  
	//}
	
	//}
	
	print $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  ."<br>";
	$porcja += $tablica[$i][3];
	$j++;
	//print $z;
	//$status = false;
	//$status = true;
	//print $z;
	//$z++;
	//$status = false;
	$z++;
      }
      else if ($pierwsza == true){
      
      
	
	//else $porcja2[$z] = $porcja;
	//if ($stan2 == 0 or $stan == $stan2) {
	if ($status == false) {
	if ($j != 0) {
	$data1[$z]['porcja'] = $porcja / $j;
	}
	$data1[$z]['dwa'] =  $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  ."<br>";
	print "gowno";
	$status = true;
	}
	print  $j;
	$stan2++;
	//}
	$porcja = 0;
	$j = 0;
	
	
      }

      
      if ($tablica[$i][3] != $tablica[$i-1][3]) {
	//print "dobrze";
      //$j++;
      }
      //$status = false;
      }
      
    $i++;
    
    }
    //print_r($data1);
    //if (!isset($data2)) {
      //$data2[$z] =  $tablica[$i-1][0] . "-" . $tablica[$i-1][1] . "-" . $tablica[$i-1][2]  ."<br>";
    //}
    //print "<font color=red>" . $data1[0]['dwa']. "</font>"; 
    //print count($data1);
    var_dump($data1);
    for ($z=0;$z < 1;$z++) {
	print $data1['jeden'][$z];
    
    }
   //$a = array_keys($data1);
   //$a = array_uintersect_assoc($data1, $data1,"dwa");
   //print var_dump($a);
    //foreach ($data1 as $data11) {
    //print $data1['jeden'];
    //print "<font color=red>" . $data11->porcja . "</font>";
    
    //print $data11->dwa;
    //if ($z == count($data1)) print "<font color=red>" .  $porcja2[$z-1] . "</font>";
    //else print "<font color=red>" .  $porcja2[$z+1] . "</font><br>";
    //}
  //  var_dump($data11);
    
    print $i . "<br>" . $j;
    print "<br>" . $z;
    print "<br>" . count($data1) . "<br>";
    
  }
0

Zamiast wrzucać cały kod (jeszcze taki syf) którego nikomu nie chce się w żaden sposób analizować, napisz na prostym przykłądzie gdzie dokładnie tkwi problem.
np masz 2 tablicę, chcesz wyciąć wszystkie wartości będące w 1 tablicy ale nie będące już w drugiej.. odp użyj funkcji array_diff.

0

Mam np. dane z jednej tabeli np godzina wzięcia leku 2018-04-04 1212d dawce leki się różnią nazwą dawką i datą i np ktoś może brać lek x przez 10 dni i następnie mieć przerwę 5 dniową potem znowu brać przez 20 dni i mi chodzi o to, żeby każde wzięcie było wydrukowane np. ten co brał przez 10 dni to nap data rozpoczęcia 2018-04-10 dawka średnia 50 data zakończenia 2018-04-20 i następna data data rozpoćżecia 2018-04-25 porcja średnia 200 data zakończenia 2018-05-15 i chodzi jeszcze żeby liczył średnią porcją dla tego leku, kt©y by brany.

0

Problem jest już rozwiązany tylko nadszedł drugi problem w momencie kiedy próbuje wydrukować w pętli wartość foreach ($data1 as $data2) {
print $data2[2];
}
dla indexu 0 tak się nie dzieje daje kod.

public function oblicz_srednia() {
   $wspolne = new \App\Http\Controllers\wspolne();
    $id_produkt = DB::select("select id_produktu from spozycie where id = " . Input::get('id') . "");
    foreach ($id_produkt as $id_produkt2) {}
    $produkt = DB::select("select nazwa,ile_procent,id from produkty where id = '" . $id_produkt2->id_produktu ."'");
    foreach ($produkt as $produkt2) {}
 
    $daty_produktow = DB::select("select sum(porcja) as porcja,year(data) as data1,month(data) as data2,day(data) as data3,id_produktu,cena from spozycie where  id_produktu ='" .  $id_produkt2->id_produktu  ."' and data < '2018-03-30' group by data1,data2,data3");
    $i = 0;
    $j = 0;
    $z = 0;
    $porcja = "";
    $tablica = array();
    $data1 = "";
    $status = false;

    foreach ($daty_produktow as $data_produktow2) {
      $tablica[$i][0] = $data_produktow2->data1;
      $tablica[$i][1] = $data_produktow2->data2;
      $tablica[$i][2] = $data_produktow2->data3;
      $tablica[$i][3] = $data_produktow2->porcja;
      
      //print $tablica[$i][2];
      
      if ($i != 0) {
      $liczba_sekund1 = $wspolne->oblicz_liczbe_sekund($tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2] . " 05:00:00");
       //liczba sekund które różnią  dla starszego rekordu
      $liczba_sekund2 = $wspolne->oblicz_liczbe_sekund($tablica[$i-1][0] . "-" . $tablica[$i-1][1] . "-" . $tablica[$i-1][2] . " 05:00:00");
      //$j = 0;
    $wynik = $liczba_sekund1 - $liczba_sekund2;
    if ($wynik > 86400) {
    print "<font color=red>" . $wynik . "</font><br>";
    }
      $wynik2 = 86400;
      
     
      if ($wynik  == $wynik2) {
 
      //$status
    //if ($j == 0) {
    $data1[$z][0] = $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2];
    print "dobrze";
    //}
    print $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  ."<br>";
    $porcja += $tablica[$i][3];
    $j++;
    //print $z;
    if ($status == true) {
    //$z++;
    }
    //print $z;
    //$z++;
    
      }
      else if ($wynik > $wynik2)  {
 
      print "gowno";
    if ($j != 0) {
    $data1[$z][1] = $porcja / $j;
    }
    else {
      $data1[$z][1] = 0;
    }
    //else $porcja2[$z] = $porcja;
    $data2[$z][2] =  $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  ."<br>";
    print  $j;
    $porcja = 0;
    $j = 0;
    
    if ($status == false) {
    //$z++;
    }
      }
      if ( ($wynik  < $wynik2) or ($wynik > $wynik2) ) {
      $z++;
      }
 
      if ($tablica[$i][3] != $tablica[$i-1][3]) {
    //print "dobrze";
      //$j++;
      }
      }
 
    $i++;
    }
    print_r($data1);
    //if (!isset($data2)) {
      //$data2[$z] =  $tablica[$i-1][0] . "-" . $tablica[$i-1][1] . "-" . $tablica[$i-1][2]  ."<br>";
    //}
 print "<br>" . count($data1) . "<br>";
    //print count($porcja2);
    //for ($z=0;$z < count($data1);$z++) {
    //print $data1[$z][0] . "<br>".$data1[$z][1] . "<br>" . "<font color=red>";
    //if ($z == count($data1)) print "<font color=red>" .  $porcja2[$z-1] . "</font>";
    //else print "<font color=red>" .  $porcja2[$z+1] . "</font><br>";
    //}
    foreach ($data1 as $data2) {
      print $data2[2];
    }
    print $i . "<br>" . $j;
    print "<br>" . $z;
    
 
  
0

odpal xdebuga i zobacz co petla wykonuje

0

A ja mam takie pytanie czy da się coś takiego zrobić w sql, że pobrać tylko te wyniki, których różnica w dniach jest większa niż jeden ?

0

Nie wiem czy to sqleme zrobisz.. bo nie wiem co dokłąadnie chcesz zrobić.. weź to w phpie odpal, użyj array filter i przefiltruj tablicę wg kryteriów..

0

A jak to zrobić za pomocą sql no chcę, żeby wydrukowało mi różnice w rekordach w bazie danych np dany mamy daną substancje która była brana od 10 do 20 i potem 5 dni przerwy i znowu była brana od 2 do 29 to chcę mieę to w takiej formie
2018-01-10 - 2018-01-20 średnia dawka tu ma liczyć średnią dawkę
2018-02-02 - 2018-02-29 średnia dawka tu ma liczyć średnią dawkę

Teraz jak to zrobić w sql ?

0

Najlepsze jest to, że dla niektórych danych zwraca dobre wynik, a dla niektórych złe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1