| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

10-04-2010, 07:33
|
|
jemont
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 28
|
|
verschachtelte Schleifen
Hallo,
ich bin PHP-Neuling und hänge fest.
ich hoffe ihr könnt mir helfen.
ich habe 2 verschachtelte Schleifen. Eine For-Schleife die durch ein Array mit Monatsnamen läuft und eine While-Schleife die Veranstaltungen aus einer Datenbank holt.
Ich will die Veranstaltungen nach Monaten auflisten und nur einmal den Monatsnamenm nennen
hier ist mein Skript
Code:
$events = mysql_query("SELECT *,MONTH(sd) AS start FROM event WHERE public='1' ORDER BY sd");
for($mnr=1;$mnr<=12;$mnr++ ){
while($event=mysql_fetch_array($events)){
$mnr=$event[start];
echo"<tr><td>Veranstaltungen im $monate[$mnr]</td></tr>";
printf("
<tr><td>%s %s %s</td></tr>\n",
$event[sd],$event[d_city],$event[start]);
}
}
hier erhalte ich über jede Veranstaltung die Überschrift "Veranstaltungen im X". Ich schaffe es nicht mehrere Veranstaltungen unter einen monat zu listen. Ich bekomme über jeden eintrag die Monat überschrift Veranstaltung im Monat xx.
ich weiß das ich etwas brauche wie:
PHP-Code:
If($event==Monat[mnr]){
aber ich weiss nicht wohin in die Schleife die Bedingung muss. $event definiere ich erst in der While-Schleife Den Titel gebe ich schon in der For-Schleife aus.
Geändert von jemont (10-04-2010 um 13:24 Uhr)
|

10-04-2010, 10:01
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo und willkommen im Forum,
zuallererst und bevor du Hilfe bekommst, liest du dir bitte die Forenregeln durch und passt deinen Beitrag entsprechend an. Danke.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

10-04-2010, 17:29
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von jemont
ich habe 2 verschachtelte Schleifen. Eine For-Schleife die durch ein Array mit Monatsnamen läuft und eine While-Schleife die Veranstaltungen aus einer Datenbank holt.
|
Das ist ein für das Vorhaben ziemlich ungeeigneter Ansatz.
Die while-Schleife läuft ein mal über alle Ergebnisse - und dann kommt der nächste Durchlauf der for-Schleife, in dem es schon gar keine Ergebnisse mehr abzuholen gibt, also wird ab dann die while-Schleife überhaupt nicht mehr durchlaufen.
Zitat:
|
hier erhalte ich über jede Veranstaltung die Überschrift "Veranstaltungen im X".
|
Natürlich, du gibst den Monat ja auch mit jeder Veranstaltung zusammen aus.
Zitat:
|
Ich will die Veranstaltungen nach Monaten auflisten und nur einmal den Monatsnamenm nennen
|
Du willst also einen sogenannten Gruppenwechsel programmieren. Informiere dich mit Hilfe dieses Stichwortes.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

10-04-2010, 17:37
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von jemont
PHP-Code:
for($mnr=1;$mnr<=12;$mnr++ ){ // ... $mnr=$event[start]; // ... }
|
Das ist Käse  In einer Schleife darfst du dir nicht die Zählvariable überschreiben.
Ich würde erstmal die Ergebnisse aus der DB in ein Array holen. Das kannst du dann nämlich beliebig oft (also für jeden Monat) durchgehen. Das MySQL-Ergebnis (wie wahsaga schon schrieb) kann man dagegen nur einmal durchlaufen, dann ist es leer.
Wenn du verschachtelte Schleifen hast, musst du dir klar werden, an welcher Stelle PHP wann vorbei kommt. Die Ausgabe des Monats muss daher innerhalb der äußeren Monatsschleife liegen, aber außerhalb (konkret vor) der inneren Schleife.
Grundlagen zum Debugging sind an dieser Stelle auch nicht unvorteilhaft, weswegen du das nachholen solltest.
Bitte PHP-Tags für PHP-Code benutzen (  ).
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

11-04-2010, 01:32
|
|
jemont
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 28
|
|
@AmicaNoctis
sorry sollte heißen
PHP-Code:
if($mnr==$event[start])
ist klar dass ich in der Scleife nicht die variable überschreiben kann.
Wenn ich den title in der äußeren Schleife habe, wie kann ich dann verhindern, einen title/monat zu haben wenn es keine Veranstaltung in diesem monat gibt?
ich habe ja noch nicht die variable $event[start] difiniert
@Wahsaga
danke ich suche mal nach Gruppenwechsel
|

11-04-2010, 02:36
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von jemont
danke ich suche mal nach Gruppenwechsel
|
Das würde auch deine andere Frage erübrigen. Du iterierst dann halt nicht über alle möglichen Monate, sondern nur noch über die vorhandenen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

11-04-2010, 12:42
|
|
jemont
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 28
|
|
ich haben noch einen zweifel zu den gruppenwechseln.
geht das nur wenn ich aus 2 tabellen über join einen array bilde?
ich habe die moante in einem array, aber nicht aus der datenbank und habe über while einen array meines querys.
kann ich die über merge_array vereinigen und von da aus so weitermachen als sei das ein query.
dann weiss ich aber mit der while-schleife nicht weiter
oder ist es sinnvoller eine neue tabelle zu erstellen month: id,monat
aber wie vereinige ich diese mit meiner eventliste. da habe ich eine datumsspalte jjjj-mm-tt und ich nehem den monat daraus und sortiere damit die queries kann ich eine alias-spalte MONTH(sd) AS start mit einer einer tabelle joinen, in der ich id_int und moant=varchar habe?
|

11-04-2010, 13:00
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von jemont
ich haben noch einen zweifel zu den gruppenwechseln.
geht das nur wenn ich aus 2 tabellen über join einen array bilde?
|
Nein, ein Gruppenwechsel macht immer Sinn, wenn das Abfrageergebnis (egal wie es entstanden ist) mehrere gleiche Werte in derselben Spalte haben kann.
Zitat:
Zitat von jemont
ich habe die moante in einem array, aber nicht aus der datenbank und habe über while einen array meines querys.
|
Das ist sinnvoll, wenn du alle Monate auflisten willst, also auch die, zu denen es keinen Datensatz gibst. Da du aber nur die in der DB vorhandenen Monate anzeigen willst, kannst du dieses Array wegwerfen und nur den Gruppenwechsel umsetzen.
Zitat:
Zitat von jemont
oder ist es sinnvoller eine neue tabelle zu erstellen month: id,monat
|
Nein, das wäre sinnlos.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

11-04-2010, 13:30
|
|
jemont
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 28
|
|
ok, jezt bin ich durcheinander gekommen.
die titel sollen monatsnamen sein auf deutsch und auf spanisch.
wenn ich kein array habe und auch keine tabelle, wo bekomme ich die monatsnamen her? in meienr eventtabelle habe ich keine monate sondern nur formatierte daten (jjjj-mm-tt).
wie kann ich bei einem gruppenwechsel also überprüfen:
wenn alter titel ungleich neuer titel
...
|

11-04-2010, 13:34
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von jemont
ok, jezt bin ich durcheinander gekommen.
die titel sollen monatsnamen sein auf deutsch und auf spanisch.
|
Achso, dann brauchst du natürlich ein Array, aber nicht, um es zu durchlaufen, sondern nur als Hashtable/Lookup-Table.
Zitat:
Zitat von jemont
wie kann ich bei einem gruppenwechsel also überprüfen:
wenn alter titel ungleich neuer titel
...
|
Entweder mit einer temporären Variable oder indem du die Daten hierarchisch in einem assoziativen Array ablegst. Beispiel hier.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

11-04-2010, 14:18
|
|
jemont
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 28
|
|
danke für deine Geduld,
wenn ich das Beispiel richtig verstehe, sind in meinem Fall die Buchstaben meine Monate und die Namen der Rest also Veranstaltungsname, startdatum,enddatum, usw.
ich habe folgendes Versucht:
PHP-Code:
while($event=mysql_fetch_array($result)){ $event[$start][]=$event; }
um zu sehen was ich jetzt im Array habe fahre ich eine foreach-schleife nur als test:
PHP-Code:
foreach($event as $value){ echo"$value<br>";
und bekomme folgende Fehlermeldung:
Warning: Invalid argument supplied for foreach()
ist der arrayname nicht $event? habe auch $start und $event[start] probiert und bekomme den selben Fehler
oder habe ich zu viele elemente im Array?
|

11-04-2010, 14:21
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Wenn alles bei dir $event heißt, überschreibst du es dir doch jedesmal wieder. Das Überschreiben scheint dein Lieblingsfehler zu sein, oder?
Ein Array kannst du dir am besten mit print_r ansehen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

11-04-2010, 15:33
|
|
jemont
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 28
|
|
ja überschreiben scheint mir zu gefallen,
ok das array habe ich gefüllt, aber ich habe probleme mit dem implode
ich bekomme als antwort das wort array
PHP-Code:
while($event=mysql_fetch_array($result)){ $ev[$start][]=$event; } foreach($ev AS $value){ echo implode (' ]', $ev).'<br>'; }
ich bin mir nicht sicher an welcher stelle (nach welchem zeichen) ich das array trennen soll egal was ich angebe, bekomme ich das wort array
verstehe ich richtig, das ich für jede veranstaltung ein array im array habe und für jedes array im array veranstaltung einen datensatz?
dann muss doch der erst implode nach start kommen, oder?
|

11-04-2010, 15:36
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Innerhalb der Schleife wirst du sicherlich mit $value arbeiten wollen und nicht mit $ev (dem ganzen Array).
Betreibe Debugging durch Kontrollausgaben deiner Variablen, am besten mit print_r (wie gesagt).
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (11-04-2010 um 15:38 Uhr)
|

11-04-2010, 17:23
|
|
jemont
Registrierter Benutzer
|
|
Registriert seit: Apr 2010
Beiträge: 28
|
|
hallo, ich schon wieder!
ich habe es jetzt soweit, dass die veranstaltungen aufgelistet werden.
PHP-Code:
while($event=mysql_fetch_array($result)){ $ev[$start][]=$event; } foreach($ev AS $key=> $value){ foreach($value AS $key => $val){ echo" <tr class='evltop'><td>$val[sd]</td><td>$val[d_city]</td><td>$val[d_land]</td></tr> <tr><td class='evintro' colspan='3'>$val[d_desc]</td></tr>"; } } }
jetzt muss ich ich die überschrift einfügen.
die Monate habe ich in einem Array
kann ich den gruppenwechsel mit foreach machen? das ist doch eigentlich nur für array. allerdings sind meine monatsnamen in einem array
ich sehe den gruppenwechsel immer im zusammenhang mit while
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|