grupare note

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
trif
Mesaje:500

grupare note

salut, am si eu o problema am scriptul acesta

Cod: Selectaţi tot

$query = "SELECT * FROM discipline, studenti
INNER JOIN note
ON studenti.cnp = note.cnp
WHERE note.id_disciplina = discipline.id_disciplina AND note.cnp = studenti.cnp";
$result=mysql_query($query);
$num=mysql_num_rows($result);
echo $query;
$i=0;
echo '<ol>';
while ($i < $num) {
  $rand=mysql_fetch_array($result);
	echo ' <li>'.$rand['nume'].' '.$rand['valoare'].' <br> </li>';
    ++$i;
}
echo '</ol>'; 
care imi afiseaza numele si notele studentilor dar problema este ca imi afiseaza in felul urmator:

Cod: Selectaţi tot

1.a 10
2. b 9
3.a 7
4. b 5
imi afiseaza studentii cu prima lor nota si dupaia ii ia de la capat si ii afiseaza cu a doua nota si tot asa si mie imi trebuie sa imi afiseze studentii cu notele lor ca de exemplu:

Cod: Selectaţi tot

1. a 10 7 6 4 10
2. b 9 5 7 8 9 
. sper ca intelegeti. cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Incearca varianta de mai jos. Vezi cum e schimbat codul si ce e nou, in caz ca trebuie ceva adaugat sa poti face singur.

Cod: Selectaţi tot

<?php
$query = "SELECT * FROM discipline, studenti
INNER JOIN note
ON studenti.cnp = note.cnp
WHERE note.id_disciplina = discipline.id_disciplina AND note.cnp = studenti.cnp";
$result=mysql_query($query);
$num=mysql_num_rows($result);
echo $query;
$i=0;

$student = array();
while ($i < $num) {
  $rand=mysql_fetch_array($result);
   $student[$rand['nume']][] = $rand['valoare'];
   ++$i;
}

echo '<ol>';
foreach($student as $nm => $val) {
  echo '<li>'. $nm. ' '. implode(' ', $val). '</li>';
}
echo '</ol>';
?>

trif Mesaje:500
salut, multumesc pt raspuns. merge dar este o mica problema, la prima vedere nu se observa problema dar sa iti explic:
am facut cum ai zis u si am luat codul acela si a mers dar cu o nota in plus si nu mi-am dat seama pana nu am modificat in loc de valoare am pus denumire si atunci imi afiseaza numai materiile si am vazut ca imi apare o materie in plus. ca de exemplu am dat pe semestre in felul urmator:

Cod: Selectaţi tot

$query = "SELECT * FROM discipline, studenti
INNER JOIN note
ON studenti.cnp = note.cnp
WHERE note.id_disciplina = discipline.id_disciplina AND note.cnp = studenti.cnp AND discipline.semestru=1";
$result=mysql_query($query);
$num=mysql_num_rows($result);
echo $query;
$i=0;
$student = array();
while ($i < $num) {
  $rand=mysql_fetch_array($result);
   $student[$rand['nume']][] = $rand['denumire'] ;
   ++$i;
}
echo '<ol>';
foreach($student as $nm => $val ) {

  echo '<li><b>'. $nm. '</b> semestru 1<br>'. implode(' <br>', $val). ' </li>';
}
echo '</ol>';
pe semestru 1 si imi afiseaza 5 cum trebuie.

Cod: Selectaţi tot

MATEMATICA 
CONTABILITATE 
INFORMATICA 
MARKETING 
STATISTICA
DAR pe semestru 2 este problema, teoretic trebuie sa imi afiseze tot 5 materii dar imi afiseaza 6, asa:

Cod: Selectaţi tot

MICROECONOMIE 
MACROECONOMIE 
ECONOMIA INTREPRINDERII 
SOCIOLOGIE 
MANAGEMENTUL RESURSELOR UMANE 
ECONOMIA INTREPRINDERII   <<<<---------------- aceasta se repeta
ultima este in plus. apropo problema asta se intampla indiferent de ce pun in loc de valoare sau denumire. nu stiu de ce.
mai este o rugaminte, la codul de mai sus am vrut sa il modific si sa imi dea denumirea la materie si notele ca de exemplu: MATEMATICA 10 9 6 7 6 5 5 etc. si nu stiu cum sa fac media. sper ca ai inteles. nu stiu cum sa le fac chit ca tot le-am invartit da dar numai erori imi dadea si am zis sa intreb ca este mai bine, apelez pt ca chiar nu stiu cum sa fac. multumesc pt raspuns. cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Media se poate afla cu array_sum($array) / count($array).

Cod: Selectaţi tot

<?php
// ...
echo '<ol>';
foreach($student as $nm => $val ) {
  $media = array_sum($val) / count($val);
  echo '<li><b>'. $nm. '</b> semestru 1<br>'. implode(' <br>', $val). ' - media: '. $media. ' </li>';
}
echo '</ol>';
?>
Despre faptul ca repeta o materie, nu stiu exact, probabil intre ele e diferena de un spatiu gol in plus si php le ia ca diferite. Incearca sa aplici trim() la datele preluate din tabel.

trif Mesaje:500
salut, am facut cum ai zis u si a mers cu trebuie dar mai este o mica problema, cum mai introduc o variabila ca sa imi afiseze numele materiilor si notele lor la acest cod:

Cod: Selectaţi tot

$query = "SELECT * FROM discipline, studenti
INNER JOIN note
ON studenti.cnp = note.cnp
WHERE note.id_disciplina = discipline.id_disciplina AND note.cnp = studenti.cnp AND discipline.semestru=1";
$result=mysql_query($query);
$num=mysql_num_rows($result);
echo $query;
$i=0;
$student = array();
while ($i < $num) {
  $rand=mysql_fetch_array($result);
   $student[$rand['nume']][] = $rand['valoare'] ;
   ++$i;
}
echo '<ol>';
echo '<ol>';
foreach($student as $nm => $val ) {
if($rand['valoare'] == 'absent' OR $rand['valoare'] <=4)
{$media = 'neincheiat'; }
else {
  $media = array_sum($val) / count($val);
  echo '<li><b>'. $nm. '</b> <br>'. implode(' ', $val). ' - media: '. $media. ' </li>';
}
}
echo '</ol>';
si mai este o problema, am facut ca daca valoarea este egala cu absent sau mai mica sau egala cu 4 sa scrie neincheiat si nu merge, de ce?. cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
La prima intrebare, nu stiu. Scuze, dar nu am in minte acel script, structura lui, a tabelelor din baza de date, etc.
Dar, poate merge sa mai faci in acel while() un array pt. note si materii, cam asa:

Cod: Selectaţi tot

$note[$rand['materie']] = $rand['note'] ;
Dar apar iar alte probleme cu ordinea lor in functie de student, afisare, si tot asa se complica si necesita cunostinte mai cu experienta si preocupare.

La a doua problema: $rand['valoare'] nu face parte din variabilele acelui foreach().
In loc de if( ... ) , incearca:

Cod: Selectaţi tot

if(in_array('absent', $val) || in_array(1, $val) || in_array(2, $val) || in_array(3, $val) || in_array(4, $val)) {$media = 'neincheiat'; }

trif Mesaje:500
salut, am o mica problema si nu stiu cum sa o rezolv, media nu se face asa:

Cod: Selectaţi tot

$media = array_sum($val) / count($val);
ci

Cod: Selectaţi tot

$rand['valoare']*$rand['credit']/60
dar nu stiu cum sa o pun in cod. si mai este o mica problema, cu

Cod: Selectaţi tot

if(in_array('absent', $val) || in_array(1, $val) || in_array(2, $val) || in_array(3, $val) || in_array(4, $val)) 
{
$media = 'neincheiat'; 
}
nu imi afiseaza studentii care au 1,2,3,4 sau absent si eu doresc daca se poate ca sa imi afiseze dar in loc de media sa fie neincheiat. sper ca intelegi? va multumesc, cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
$media = array_sum($val) / count($val); este formula mediei aritmetice.
Incearca asa:

Cod: Selectaţi tot

<?php
$query = "SELECT * FROM discipline, studenti
INNER JOIN note
ON studenti.cnp = note.cnp
WHERE note.id_disciplina = discipline.id_disciplina AND note.cnp = studenti.cnp";
$result=mysql_query($query);
$num=mysql_num_rows($result);
echo $query;
$i=0;

$student = array();
while ($i < $num) {
  $rand=mysql_fetch_array($result);
   $student[$rand['nume']][] = $rand['valoare'];
   $student[$rand['nume']]['media'] = ' - media: '. $rand['valoare']*$rand['credit']/60;
   ++$i;
}

echo '<ol>';
foreach($student as $nm => $val ) {
  if(in_array('absent', $val) || in_array(1, $val) || in_array(2, $val) || in_array(3, $val) || in_array(4, $val))
  {
    $val['media'] = ' - media: neincheiat';
  }
  echo '<li><b>'. $nm. '</b> semestru 1<br>'. implode(' ', $val). ' </li>';
}
echo '</ol>';
?>

trif Mesaje:500
salut, am incercat cum ai zis, dar nu imi afiseaza ceea ce imi trebuie, asta imi afiseaza:
DEMIAN T TEODORA DANIELA
4 - media: neincheiat
5 absent 8 5
si nu este corect, ci trebuie sa fie ceva de genu:
DEMIAN T TEODORA DANIELA
media: neincheiat
4 5 absent 8 5

sau
HAIDUC M. CALIN-MARIN
media: 6,82
8 6 5 6 8

ceva de genu imi trebuie si faza este ca nu imi calculeaza cum trebuie media pt ca media la facultate se calculeaza (nota*nr credite)/30 credite. nu se face media aritmetica. sper ca intelegi. iti multumesc, cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Incearca asa

Cod: Selectaţi tot

<?php
// ...
$student = array();
while ($i < $num) {
  $rand=mysql_fetch_array($result);
   $student[$rand['nume']][] = $rand['valoare'];
   $student[$rand['nume']]['media'] = ' - media: '. $rand['valoare']*$rand['credit']/30. '<br />';
   ++$i;
}

echo '<ol>';
foreach($student as $nm => $val ) {
  if(in_array('absent', $val) || in_array(1, $val) || in_array(2, $val) || in_array(3, $val) || in_array(4, $val))
  {
    $val['media'] = ' - media: neincheiat';
  }
  natcasesort($val);
  echo '<li><b>'. $nm. '</b> semestru 1<br>'. implode(' ', $val). ' </li>';
}
echo '</ol>';
?>
Atat ma pricep. Media o poti modifica cum stii tu, la: $rand['valoare']*$rand['credit']/30