Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Branie do średniej oceny poprawionej jeżeli jest
Forum PHP.pl > Forum > Przedszkole
kuba_pilach
Witam, mam pobieram średnią ocen z danego przedmiotu i zaokrąglam ją:
  1. $wynik = mysql_query("SELECT NAZWA, GROUP_CONCAT(Oceny.OCENA) AS lista_ocen, AVG(Oceny.OCENA) AS srednia FROM Oceny AS Oceny LEFT JOIN Przedmiot AS Przedmiot ON Oceny.ID_PRZEDMIOTU = Przedmiot.ID WHERE Oceny.ID_USERA = '$z[ID]' GROUP BY Oceny.ID_PRZEDMIOTU")
  2. or die(mysql_error());
  3.  
  4. /*
  5. wywietlamy wyniki, sprawdzamy,
  6. czy zapytanie zwróciło wartoć większą od 0
  7. */
  8. ?>
  9. <ul>
  10. <div id="form_container">
  11. <div>
  12. <?php
  13. if(mysql_num_rows($wynik) > 0) {
  14. /* jeżeli wynik jest pozytywny, to wywietlamy dane */
  15. echo "<br />";
  16. echo "<table cellpadding=\"2\" border=1>";
  17. echo "<tr>";
  18. echo "<td>Przedmiot</td>";
  19. echo "<td>Oceny</td>";
  20. echo "<td>Srednia</td>";
  21. echo "</tr>";
  22. while($r = mysql_fetch_assoc($wynik)) {
  23. echo "<tr>";
  24. echo "<td>".$r['NAZWA']."</td>";
  25. echo "<td>".$r['lista_ocen']."</td>";
  26. $r['srednia'] = round($r['srednia'], 2);
  27. echo "<td>".$r['srednia']."</td>";

I to już mam prawidłowo... Ale dodałem możliwość wpisywania z / znacznikiem poprawienia, więc pytanie moje jest takie:
Jak sprawdzić, czy w każdej pojedynczej jest druga ocena podana oddzielona znakiem /, a jeżeli jest, to brać tą drugą do liczenia średniej... Jest takie coś możliwe? Dzięki z góry!
Daiquiri
Jeżeli dobrze rozumiem to strpos i explode.
kuba_pilach
A może by ktoś coś więcej napisał...? Bo przeczytałem o tych rzeczach,ale nadal nie wiem, jak je połączyć
z moim kodem... Bardzo proszę i dzięki z góry...
Daiquiri
Zakładam, że masz zmienną $ocena = "4/5". Jeżeli chcesz sprawdzić czy w zmiennej występuje "/" korzystasz z strpos():
  1. $szukaj = '/';
  2. $pos = strpos($ocena, $szukaj);
  3.  
  4. if ($pos === false) {
  5. echo "Nie ma łamania w zmiennej";
  6. } else {
  7. echo "Jest łamanie w zmiennej";
  8. }
Skoro wiesz, że masz łamanie (/) w zmiennej, korzystasz z explode():
  1. $tab_ocena = explode('/', $ocena);
  2. // $tab_ocena[0] będzie miało wartośc 4
  3. // $tab_ocena[1] będzie miało wartość 5
  4. $ocena = $tab_ocena[1] // bo Ciebie interesuje ta druga wartość
Możesz też skorzystać z substr i po prostu "obciąć" początkową ocenę oraz /.
kuba_pilach
Witam, ale największy problem jest w tym, że za pomocą zapytania tworzę alias lista_ocen... Który bierze każdą ocenę z przedmiotu i wypisuje jak na kartce z ocenami... Weś daj jakby to wyglądało w moim kodzie... Dzięki z góry

Odświeżam i nadal potrzebuję pomocy!
Daiquiri
No to wstaw wszystko w while, a zamiast zmiennej $ocena wykorzystaj swoją zmienną np. $r['lista_ocen'] (jeżeli tam trzymasz ocenę).
kuba_pilach
Sorki za moje niezrozumienie, ale lista_ocen przechowuje wszystkie oceny po przecinku z danego przedmiotu...
Daiquiri
No to rozbij ją na poszczególne oceny korzystając z $tab_ocen = explode(",", $r['lista_ocen']);, dzięki temu wszystkie oceny będą dostępne pojedynczo w tablicy $tab_ocen ($tab_ocen[0], $tab_ocen[1] itd.). Każdą z pozycji możesz wtedy potraktować kodem powyżej, czyli np.
  1. $tab_ocen = explode(",", $r['lista_ocen'] );
  2. $ile = count($tab_ocen);
  3. for ($i=0; $i<$ile; ++$i) { // przechodzisz przez każdą pozycję z tablicy ocen:
  4. // tutaj wstaw kod z strpos, czyli sprawdzanie czy ocena jest "łamana"
  5. // w przypadku gdy znajdziemy znak łamania wykorzystaj explode() lub substr()
  6. }
kuba_pilach
A potem jak wykorzystać to do średniej?
Bo właśnie taki jest mój końcowy cel ;]
kefirek
  1. while($r = mysql_fetch_assoc($wynik)) {
  2. $tab_ocen = explode(",", $r['lista_ocen']);
  3.  
  4. $ile = count($tab_ocen);
  5.  
  6. $avg = 0;
  7.  
  8. for ($i=0; $i<$ile; ++$i) {
  9. $ocena = array();
  10. if(strpos($tab_ocen[$i], '/')){
  11.  
  12. $ocena = explode("/", $tab_ocen[$i]);
  13. $avg += $ocena[1];
  14.  
  15. } else {
  16.  
  17. $avg += $tab_ocen[$i];
  18.  
  19. }
  20.  
  21. }
  22.  
  23. echo round($avg / $ile , 2);
  24.  
  25. }
kuba_pilach
Ok, dzięki wam! Działa wszystko dobrze... Dałem że pomogliście ;]
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.