Archiv verlassen und diese Seite im Standarddesign anzeigen : php und MySql ... Array in Array
Hallo erstmal,
Also , ich hab da (natürlich) ein kleines Problem, was euch Profis gewiss lächerlich erscheint.
Aber ich bin "nur" Flashdesigner.*Ausrede such*
Also, ich habe eine Datenbank, in der sich Schüler und deren Noten befinden.
Diese lese ich so aus:
$rest = mysql_query($noten)or die(mysql_error());
while ($rowe = mysql_fetch_assoc( $rest ))
{
$sqlfach1 ="SELECT *FROM notentab WHERE f_id = 1 AND notentabns_id = '$rowe[s_id]'";
$resfach1 = mysql_query($sqlfach1);
while ($rowfach = mysql_fetch_assoc ($resfach1))
{
$noten1array[$rowfach['n_id']]= utf8_encode($rowfach['zensuren']);
$mnot1 = implode(',',$noten1array);
echo "&mathe=$mnot1"; }
Nun habe ich leider mehrere Schüler, und dort auch mehrere Zensuren im Fach.
In diesem Fall sehen die Noten dermaßen aus:
Schüler 1 = 1.0 , 5.0
Schüler 2 = 2.0
Nun muß ich das Ganze so hinkriegen, daß Flash das lesen kann.
Also erstellte ich den Array ( deshalb auch das & vor der Ausgabevariable)
Derzeitige Ausgabe: &mathe= 1.0,5.0,2.0
Leider, wie gesagt, zwei Schüler.
Wie kann ich nun hinbekommen, daß die Ausgabe
&mathe= 1.0,5.0|2.0 heisst ?
Also zuerst die Zensuren von Schüler 1 dann "|" dann Schüler 2.
Danke schon mal im Vorraus
Bin zwar kein Profi, aber ich würd mal sagen, du solltest ne zusätzliche Schleife anhängen. For Each würd ich sagen...
Also er soll für jeden Schüler den noten-string ausgeben, die mit "," getrennt werden und diese wieder mittels "|" voneinander trennen.
kann dir den code zwar ned sagen, aber ohne schleife wird da wohl nix gehn denk ich.
greez
liquid
Rolandbar 12-12-2005, 19:03 hi
wie sieht den die datenbank struktur aus?
wenn die schleife die schüler durchgeht, probiere mal das,
$temp_1 = "&mathe=";
$first = true;
$rest = mysql_query($noten)or die(mysql_error());
while ($rowe = mysql_fetch_assoc( $rest ))
{
$sqlfach1 ="SELECT *FROM notentab WHERE f_id = 1 AND notentabns_id = '$rowe[s_id]'";
$resfach1 = mysql_query($sqlfach1);
while ($rowfach = mysql_fetch_assoc ($resfach1))
{
$noten1array[$rowfach['n_id']]= utf8_encode($rowfach['zensuren']);
$mnot1 = implode(',',$noten1array);
if($first = true)
{
$temp_1 .= $mnot1;
$first = false;
} else
{
$temp_1 .= "|" . $mnot1;
}
}
echo $temp_1;
hmmm... das klingt schön, ist aber nur für zwei Schüler ( wenn ich das Skript richtig verstehe)
Ich werde aber nicht wissen,
wieviel Schüler dort noch dazukommen, sind nur in diesem Beispiel 2 Schüler.
Aber danke
Rolandbar 12-12-2005, 19:22 ist aber nur für zwei Schüler ( wenn ich das Skript richtig verstehe)
genau darum habe ich gefragt wie die datenbank strucktur aussiert,
zb bei phpmyadmin schaueuen: exportieren, tabelle notentab wählen, nur strucktur.
normal müsst es für unendlich viele schüler sein wenn die While schreiffe die schüler durchgeht, was ich aber ohne die datenbank strucktur nicht sagen kann.
mfg Roland
Also die Tabelle notentab beinhaltet die Spalten ns_id (= schueler.s_id = id des Schülers),
f_id (= faechername wird dorther geholt), und den "zensuren".
Würde das Fach auch gern dynamisch durchlaufen lassen, damit da noch ein Fach dazukommen könnte, aber für den Anfang reicht es so.
Die Tabelle notentab wird dann vom Lehrer ausgefüllt.
$rowe[s_id] = die Id des jeweiligen Schülers.
Ich bin grad dabei zu probieren, das ganze per foreach zu lösen.
Leider funktioniert das auch noch nicht so, wie ich es möchte, bin also für Antworten dankbar.
jippie
Rolandbar 13-12-2005, 19:06 1: mit notentabns_id = '$rowe[s_id] hollst du ja ber nur einen besteimmten schüler, also nur die noten(fächer) von einem schüler und nicht zwei oder mehr, wenn ich das richtig verstanden habe.
2: mein forschlag:
folgende struktur finde ich gut
id int(11) auto_inclement primärschlüssel
s_id int(11)
fach varchar(50)
noten text
bei noten kommen die noten zum jeweiligen fach.
s_id ist die schüler id und id ist für den index damit man mal nur einen bestimte zeile holen kann... zb;
id s_id fach noten
-----------------------------------------
1 3 Mathe 1.0,2.0.5.5,4.5
2 3 Deutsch 6.0,6.0,6.0,6.0
3 8 mathe 1.0,1.0,1.0
dann kanst du nur ein bestimmtes fach oder einbestiemten schüler
und und und wählen.
meinst du das so in etwa?
So sieht das ganze Script aus:
<? require ("config.inc.local.php");
$schueler = " SELECT * FROM schueler
INNER JOIN klasse ON (klasse.k_id = schueler.sklassen_id)
INNER JOIN mitteilung ON (mitteilung.s_id = schueler.s_id)
WHERE klasse.kname = '$klid'
AND schueler.slehrer_id = '$lid'
AND klasse.schulename = '$schname' ";
$res = mysql_query($schueler)or die(mysql_error());
while ($row = mysql_fetch_assoc( $res ))
{
$nachnamearray[$row['s_id']]= utf8_encode($row['snachname']);
vornamearray[$row['s_id']]= utf8_encode($row['svorname']);
$mitteilarray[$row['s_id']]= utf8_encode($row['privat']);
$nachnamenk = implode(',', $nachnamearray);
echo "&schulername=$nachnamenk";
$vornamenk = implode(',', $vornamearray);
echo "&schulervname=$vornamenk";
$mitteil = implode('|',$mitteilarray);
echo "&mitteilung=$mitteil";
{ // alle Noteneinträge zum übergebenen Fach $f_id ermitteln
$sql="SELECT * FROM notentab WHERE f_id=1
AND ns_id='$row[s_id]'";
$resnoten = mysql_query($sql);
$note=ARRAY();
//Array aufbauen mit der Schüler-ID als Index
while ($rownoten = mysql_fetch_assoc($resnoten))
{
//gibts den Index für diesen Schüler schon? Dann weitere Noten anhängen
if (isset($note[$rownoten['ns_id']]))
$note[$rownoten['ns_id']].=$rownoten['zensuren'].',';
// sonst Index für den Schüler anlegen und Note übernehmen
else $note[$rownoten['ns_id']]=$rownoten['zensuren'].',';
}
//echo ausgabe und Aufbau des Arrays
foreach ($note AS $key=>$val)
{
echo "¬e[$key]=$val";
$notenarray= implode ('|',$note);
echo "&manoten=$notenarray";
} // alle Noteneinträge zum übergebenen Fach $f_id ermitteln
$sqld="SELECT * FROM notentab WHERE f_id=2 AND ns_id='$row[s_id]'";
$resnotend = mysql_query($sqld);
$noted=ARRAY();
//Array aufbauen mit der Schüler-ID als Index
while ($rownotend = mysql_fetch_assoc($resnotend))
{
if (isset($noted[$rownotend['ns_id']]))
$noted[$rownotend['ns_id']].=$rownotend['zensuren'].',';
else $noted[$rownotend['ns_id']]=$rownotend['zensuren'].',';
}
foreach ($noted AS $key=>$val)
{
echo "¬ed[$key]=$val";
$notenarrayd= implode ('|',$noted);
echo "&deutschnoten=$notenarrayd"; } } } ?>
Soweit bin ich nun "schon".
Also, ich schicke per Flash die Schule,Klasse und den Lehrer.
Nun soll mir php einen Array herstellen, mit den Noten (im jeweiligen Fach: f_id) nur von den Schüler aus der Klasse.
also manoten = zensuren schüler1|zensuren schüler2|usw.
Beispiel:
Schüler 1 hat in Mathe die Noten : 1.0,5.0
Schüler 2 hat in Mathe die Noten : 3.0,4.0,1.0
Schüler 3 hat in Mathe die Noten: 2.0
Ausgabe (gewünscht) : manoten=1.0,5.0|3.0,4.0,1.0|2.0
Funktioniert im Moment nicht,
derzeitige Ausgabe:
manoten=1.0,5.0 manoten= 3.0,4.0,1.0 manoten= 2.0
reallife 13-12-2005, 19:49 Kannst Du deinen Beitrag mal bitte editieren und den Code mithilfe des vB Code darstellen? Das macht das ganze einfacher zu lesen, danke.
Du könntest ausserdem auch schon vieles mit einem SQL - Statement erleichtern. Stichwort: GROUP BY
Rolandbar 13-12-2005, 22:04 also das was ich beim ersten post in den php tags geschieben habe müsst eigenlich geanu das machen was du willst.
mfg Roland
<?
require ("config.inc.local.php");
$schueler = "
SELECT * FROM schueler
INNER JOIN klasse ON (klasse.k_id = schueler.sklassen_id)
INNER JOIN mitteilung ON (mitteilung.s_id = schueler.s_id)
WHERE
klasse.kname = '$klid'
AND
schueler.slehrer_id = '$lid'
AND
klasse.schulename = '$schname'
";
$res = mysql_query($schueler)or die(mysql_error());
while ($row = mysql_fetch_assoc( $res ))
{
$nachnamearray[$row['s_id']]= utf8_encode($row['snachname']);
$vornamearray[$row['s_id']]= utf8_encode($row['svorname']);
$mitteilarray[$row['s_id']]= utf8_encode($row['privat']);
$nachnamenk = implode(',', $nachnamearray);
echo "&schulername=$nachnamenk";
$vornamenk = implode(',', $vornamearray);
echo "&schulervname=$vornamenk";
$mitteil = implode('|',$mitteilarray);
echo "&mitteilung=$mitteil";
$temp_1 = "&mathe=";
$first = true;
$sqlfach1 ="SELECT * FROM notentab WHERE f_id=1 AND ns_id ='$row[s_id]'";
$resfach1 = mysql_query($sqlfach1);
while ($rowfach = mysql_fetch_assoc ($resfach1))
{
$noten1array[$rowfach['ns_id']]= utf8_encode($rowfach['zensuren']);
$mnot1 = implode(',',$noten1array);
if($first = true)
{
$temp_1 .= $mnot1;
$first = false;
} else
{
$temp_1 .= "|" .$mnot1;
}
}
echo "manoten=$temp_1";
}
so wird "manoten=&mathe=5.0,1.05.0,5.05.0,3.05.0,4.05.0,2.0 " ausgegeben.
Ich glaub, ich steh nun völlig auf dem Schlauch*grummel
|
|