verschachtelte Schleifen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 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.
    Zuletzt geändert von jemont; 10.04.2010, 13:24.

  • #2
    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
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Zitat von jemont Beitrag anzeigen
      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.

      hier erhalte ich über jede Veranstaltung die Überschrift "Veranstaltungen im X".
      Natürlich, du gibst den Monat ja auch mit jeder Veranstaltung zusammen aus.

      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.

      Kommentar


      • #4
        Zitat von jemont Beitrag anzeigen
        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
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          @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

          Kommentar


          • #6
            Zitat von jemont Beitrag anzeigen
            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.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              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?

              Kommentar


              • #8
                Zitat von jemont Beitrag anzeigen
                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 von jemont Beitrag anzeigen
                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 von jemont Beitrag anzeigen
                oder ist es sinnvoller eine neue tabelle zu erstellen month: id,monat
                Nein, das wäre sinnlos.

                Gruß,

                Amica
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  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
                  ...

                  Kommentar


                  • #10
                    Zitat von jemont Beitrag anzeigen
                    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 von jemont Beitrag anzeigen
                    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.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      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?

                      Kommentar


                      • #12
                        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.
                        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                        Super, danke!
                        [/COLOR]

                        Kommentar


                        • #13
                          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?

                          Kommentar


                          • #14
                            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).
                            Zuletzt geändert von AmicaNoctis; 11.04.2010, 15:38.
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar


                            • #15
                              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

                              Kommentar

                              Lädt...
                              X