Ankündigung

Einklappen
Keine Ankündigung bisher.

Listungsfehler For schleife

Einklappen

Neue Werbung 2019

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

  • Listungsfehler For schleife

    Hallo Leute,

    erst einmal möchte ich mich vorstellen da ich mich gerade ebend erst registriert habe. Ich bin Tom, 19 Jahre jung (bzw alt, wie man's nimmt) und hoffe auf eine tolle Zeit hier im Forum.

    Leider muss ich schon in meinem ersten Thread mit einem stumpfsinnigen Problem belästigen. Ich bastel mir gerade eine Fotogalerie für mein eigenes CMS. Ich möchte nicht auf eine DB zugreifen und möchte das nur mit PHP/CSS/Html und Ajax/Jquerry lösen.

    Das Problem:

    Leider geht mir pro Zeile 1 Ordner in der anzeige verloren. An der Funktion
    in meiner Security Klasse (Die auch das sichere dir lesen übernimmt) liegt es
    nicht, denn die $Howmuch Variable gibt mir die volle Anzahl aus.

    Es könnte durchaus sein, dass ich einfach mal nen Denkfehler hab oder etwas übersehe. Ich sollte vielleicht mal ein bisschen an die frische Luft, dennoch hier der Php Code:

    PHP-Code:
    <?php

    global $Safety;

        
    $Folders $Safety->get_folders("content/gallerie/");
        
            
    $Counter 0;
            
                foreach (
    $Folders as $Folder
                { 
                    
    $Howmuch++;    // Fehlertest -> werden pro spalte 1 zu wenig angezeigt.
                    
    $Counter++;    // Counter = 1,2,3,4,5
                    
                    
    if ( $Counter >= )        // Wenn bereits 4 Spalten gefüllt wurden -> tr und Informations tr drunter
                    
    {
                        
    $Content $Content.'
                                            </tr>
                                            <tr>
                                            <td>'
    .$desc[1].'</td>
                                            <td>'
    .$desc[2].'</td>
                                            <td>'
    .$desc[3].'</td>
                                            <td>'
    .$desc[4].'</td>
                                            </tr>
                                            <tr>
                                            
                        '
    ;
                        
    $Counter 0;
                    
                    }else{                        
    // andernfalls -> desc array beschreiben & Spalte füllen
                    
                        
    $desc[$Counter] = $Folder;    // Array <- Counterint <- Ordnername
                        
    $Content $Content.'
                            <td width="114"><img src="http://www.php.de/images/Folderico.png" /></td>
                        '
    ;
                    }
                }
                
    // Desc für unvollendete Spalte ( < 5 ) nachtragen
                
                
    $Content $Content.'</tr><tr>';    // Alte Zeile schliessen und neue für Desc erstellen
                
    for ( $Counter >= 0$Counter--; ) {    // Counter bis 0 runtergehen 
                    
    $Content $Content.'    
                        <td>'
    .$desc[$Counter+1].'</td>        
                    '
    ;                                    // Desc nachtragen, counter+1 da sonst Desc immmer um 1 verschoben
                
                
    }
                
    echo <<< HTML

        <div id="Sitecontent">
            <div id="FolderContent">
            <table width="600">
            <tr>
                
    {$Content} <br> {$Howmuch}
            </tr>
            </table>
            </div>
        </div>


    HTML;
    ?>
    Ich bedanke mich schon mal für eure Hilfe.

    Synaptic~

  • #2
    Mit welchem Index beginnst du, dein Array $desc zu befüllen - und ab welchem liest du die Werte aus beim Ausgeben ...?

    Kommentar


    • #3
      Zitat von ChrisB Beitrag anzeigen
      Mit welchem Index beginnst du, dein Array $desc zu befüllen - und ab welchem liest du die Werte aus beim Ausgeben ...?
      Mit 1, richtig wäre ja 0.
      Beim ersten durchlauf ist Counter 1 ->
      $desc[1] = $Folder;

      Das Problem betrifft aber nicht die desc, sondern den part darüber,
      denn die DESC wird korrekt dargestellt.

      Kommentar


      • #4
        Zitat von SynapticPHP Beitrag anzeigen
        Das Problem betrifft aber nicht die desc, sondern den part darüber
        Keine Ahnung, was du jetzt eigentlich meinst.

        Kommentar


        • #5
          Nochmal ohne den mist drumrum:

          PHP-Code:

                 
          // Betrachten wir mal nur die schleife
                 
          foreach ($Folders as $Folder
                      { 
                     
                          
          $Counter++;     
                          
                          if ( 
          $Counter >= )      // Aller 4 Hinzugefügten Bildern (also Counter 5) soll er das machen, funktioniert auch.
                          
          {
                              
          $Content $Content.'
                                                  </tr>
                                                  <tr>
                                                  <td>'
          .$desc[1].'</td>
                                                  <td>'
          .$desc[2].'</td>
                                                  <td>'
          .$desc[3].'</td>
                                                  <td>'
          .$desc[4].'</td>
                                                  </tr>
                                                  <tr>
                                                  
                              '
          ;
                              
          $Counter 0;
                          
                          }else{                        
          // andernfalls -> Das hier, also wenn der Counter unter 5 ist, aber statt bei 7 Ordnern 4 auf der ersten Zeile zu posten und 3 auf der zweiten, postet er nur 6 statt 7 Folder.
                                                          // er verschluckt quasi immer einen Ordner pro Zeile.
                          
                            
                              
          $Content $Content.'
                                  <td width="114"><img src="http://www.php.de/images/Folderico.png" /></td> // Das mein ich mit Ordner, ist halt nen Ordnerbild.
                              '
          ;
                          }
                      } 

          Kommentar


          • #6
            Zitat von SynapticPHP Beitrag anzeigen
            Nochmal ohne den mist drumrum:
            Das ist „mistiger“ als vorher - da wird ja jetzt noch nicht mal der Counter inkrementiert ...


            Vom Initialisieren von Variablen hältst du nicht viel?
            Oder hast du das auch nur unterschlagen? Hast du wenigstens das error_reporting vernünftig eingestellt?


            Du fängst deine Elemente also bei 1 zu zählen an, und gibst dann 4 Stück aus, wenn der Zähler einen Stand von größer/gleich 5 erreicht hat ... das passt doch irgendwie alles nicht besonders gut zusammen.

            Kommentar


            • #7
              Zitat von ChrisB Beitrag anzeigen
              Das ist „mistiger“ als vorher - da wird ja jetzt noch nicht mal der Counter inkrementiert ...


              Vom Initialisieren von Variablen hältst du nicht viel?
              Oder hast du das auch nur unterschlagen? Hast du wenigstens das error_reporting vernünftig eingestellt?


              Du fängst deine Elemente also bei 1 zu zählen an, und gibst dann 4 Stück aus, wenn der Zähler einen Stand von größer/gleich 5 erreicht hat ... das passt doch irgendwie alles nicht besonders gut zusammen.
              Counter ist inkrementiert, Variable ist auch Initialisiert und hat bei Scriptbeginn den wert -> Int 0. Error reporting ist bei mir immer E_ALL und spuckt auch nix aus.

              Nein, ich fange nicht an Elemente bei 1 zu zählen, sondern mein COUNTER
              Zäht von 0 an und steh nach dem ersten druchlauf bei eins.
              Wenn du frühs aufstehst und ein Ei ist, hast du auch 1 Ei gegessen.
              Ich schreibe dem Array lediglich keinen [0] wert zu, da ich dann auch beim Counter bei -1 anfangen müsste zu zählen, oder den Counter am seitenende einbauen muss.

              Klar passt das zusammen, wenn du aufmerksam liest.
              Ich poste pro ZEILE in einer TABELLE 4 Bilder die verlinkt sind.
              Counter zählt 1, 2, 3, 4, 5 und ist nun bereit für die Anforderung >= 5 um
              in der tabelle die nächste Zeile mit der Desc zu posten.

              Kommentar


              • #8
                Du brichst dir ja fast die Finger, nutz doch eine Modula-Operation dafür:
                PHP-Code:
                // configure
                $folderCount count($Folders); // deine anzahl $Folders von oben
                $each 5// zusatz JEDE n-te Position

                // prepare
                $railway = array(); // Inject States
                $content = array(); // Inject Content

                // build states

                // (!) Setzt jeden $each-ten Wert true, rest false.
                // (?) Bei true "setzt" du zusätzlichen Content, bei false nicht, siehe unten
                foreach ( range(0,$folderCount) as $mod $railway[$mod] = !(boolean)( $mod $each );

                // durchlaufe alle Folder und injiziere zusätzlich bei true-status zusätzlichen content
                foreach ( $Folders as $i => $Folder ) {
                   
                $content[] = '<tr><td width="114"><img src="http://www.php.de/images/Folderico.png" /></td></tr>';
                   if ( 
                $railway[$i] ) {
                      
                $temp = array(); $temp[] = '<tr>';
                      foreach ( 
                range(1,4) as $what $temp[] = '<td>'.$desc[$what].'</td>';
                      
                $temp[] = '</tr>';
                      
                $content[] = join($temp);
                   }
                }

                // shift in
                $result join("\n"$content);

                // display
                echo '<table>'.$result.'</table>'
                spart dir einiges an Konkatinierungen. Wobei ich da auch anmerken möchte das es da durchaus eine kurzform gibt:
                PHP-Code:
                $bla "bla";
                $bla .= "blub"
                ist die kurzform von:
                PHP-Code:
                $bla "bla";
                $bla $bla."blub"

                Kommentar


                • #9
                  Zitat von SynapticPHP Beitrag anzeigen
                  Nein, ich fange nicht an Elemente bei 1 zu zählen, sondern mein COUNTER
                  Zäht von 0 an und steh nach dem ersten druchlauf bei eins.
                  Eben, und damit legst du dann ein erstes Element in $desc ab.

                  Klar passt das zusammen, wenn du aufmerksam liest.
                  Na dann ist's ja schön für dich, wenn alles passt

                  Was aber nicht passt, ist deine generelle Scriptlogik.
                  Du durchläufst deine Folder in einer foreach-Schleife - aber du machst nicht in jedem dieser Durchläufe auch was mit dem aktuellen $Folder. Nämlich in dem Fall nicht, wo der If-Zweig durchlaufen wird.

                  Kommentar


                  • #10
                    Zitat von ChrisB Beitrag anzeigen
                    Eben, und damit legst du dann ein erstes Element in $desc ab.


                    Na dann ist's ja schön für dich, wenn alles passt

                    Was aber nicht passt, ist deine generelle Scriptlogik.
                    Du durchläufst deine Folder in einer foreach-Schleife - aber du machst nicht in jedem dieser Durchläufe auch was mit dem aktuellen $Folder. Nämlich in dem Fall nicht, wo der If-Zweig durchlaufen wird.
                    Klar mach ich was damit und zu behaupten das meine Logik nicht passt, kannst du dir wohl nicht erlauben. Aber wenn du das meinst, werd ich mir am besten nochmal die Definition von Logik anschauen. Witz bei Seite, jeder hat eine andere Logik und benutzt andere Ansätze.

                    Ich benutze die For schleife um eine Grafische Oberfläche für meine Galerie zu erstellen, es hat keiner behauptet das der Code alles ist, oder so bleiben soll.

                    @tr0y:

                    Vielen dank für die Hilfestellung, du bist der erste der mir geholfen hat und dazu noch einen Intelligenten Lösungsansatz gepostet hat ohne mich über meine Logik zu belehren.

                    Kommentar


                    • #11
                      Zitat von SynapticPHP Beitrag anzeigen
                      Klar mach ich was damit und zu behaupten das meine Logik nicht passt, kannst du dir wohl nicht erlauben.
                      Doch, kann ich - weil es ganz offensichtlich ist, dass die Logik nicht stimmt.

                      Du läufst in deiner foreach-Schleife über alle Einträge in $Folders.
                      In dieser Schleife hast du im wesentlichen nur ein if-else.

                      Im if-Zweig gibst du das aus, was in $desc steht.
                      Und im else-Zweig und nur dort fügst du den aktuellen $Folder dem Array $desc hinzu.

                      Dass if- und else-Zweig jeweils exklusiv sind und sich gegenseitig ausschließen, muss ich dir sicher nicht erklären.
                      Und das heißt in Konsequenz natürlich genau das, was ich sagte: Wenn der if-Zweig durchlaufen wird, dann machst du mit dem aktuellen $Folder gar nichts. Der else-Zweig wird nicht durchlaufen, also geht es mit der Schleife von vorne los, und damit sind wir schon beim nächsten Eintrag aus $Folders.
                      Ergo: Der aktuelle $Folder ist in diesem Schleifendurchlauf, in dem der if-Zweig abgearbeitet wird, einfach unter den Tisch gefallen.

                      Kommentar


                      • #12
                        Zitat von SynapticPHP Beitrag anzeigen
                        @tr0y:

                        Vielen dank für die Hilfestellung, du bist der erste der mir geholfen hat und dazu noch einen Intelligenten Lösungsansatz gepostet hat ohne mich über meine Logik zu belehren.
                        Deine Logik passte nicht, das war der Grund warum ich dir meine Logik vorschlug. Da noch ausdrücklich drauf hinzuweisen hielt ich für fehl am Platze.

                        Kommentar


                        • #13
                          Klar mach ich das, das if/else ist für 2 Verschiedene dinge!

                          Mit dem If erzeuge ich die Beschreibung die unter dem Bild sitzt: Albename (Ordnername), Bildanzahl im unterordner.
                          Mit dem else -> Wird das Bild + Der link generiert für jeden Ordner generiert.
                          Es hat einen einfachen Grund warum ich im If Zweig auf Daten aus dem else Zweig zugreife und der ist -> Ordnername = Albenname der
                          angezeigt wird.

                          Stellt sich noch die Frage: Warum dann if/else ?
                          Ich habe mit Modula-Operation noch nicht gearbeitet und so realisiere ich folgendes Schema:

                          <table>
                          <tr>
                          4x Td mit dem Bild / Link
                          </tr> // Danach der Umbruch in die neue Zeile
                          4x Td mit den Informationen ( Name / Fotoanzahl )
                          und weiter ....
                          </table>

                          Eine andere Möglichkeit in einer schleife einen Abschluss wie diesen zu machen ist mir nicht eingefallen.
                          Hier nochmal der Ablauf der sich in meinem Gehirn zusammengesponnen hat:

                          Das ganze in einer For schleife:
                          1. Als erstes von alle ordner 4 Bilder mit Link für die erste Zeile erstellen
                          2. Die Daten des Ordnernamens erfassen
                          3. Einen Zeilenumbruch erstellen
                          4. Die Ordnerdaten im If Zweig verfenden und damit wieder 4 TD's erstellen.

                          Es ist sicher nicht die beste Möglichkeit aber auf jeden Fall ein logischer ablauf.
                          (Ob ich 4 mit 1 vertausche ist ja irrelevant, meine Idee wäre allerdings leichter zu verstehen
                          wenn ich die erste Aktion ins IF packe und die letzte in den Else Zweig.)

                          Kommentar


                          • #14
                            Zitat von SynapticPHP Beitrag anzeigen
                            Es ist sicher nicht die beste Möglichkeit aber auf jeden Fall ein logischer ablauf.
                            Nein, ist es nicht - schlicht und einfach aus dem Grund, weil du damit jedes mal, wenn du in den if-Zweig gehst, einen deiner Ordner „überspringst“ in der Verarbeitung.
                            Und genau das war doch das Problem, wegen dem du überhaupt erst hier gefragt hast ...

                            Kommentar


                            • #15
                              Damit du den (Un)Sinn in deiner Logik erkennst:
                              PHP-Code:
                              foreach ($Folders as $Folder) { 
                                         
                                 
                              $Counter++; // +1 auf Counter aufzählen, wenn nicht existent wert 0 + 1 = 1 setzen
                                              
                                 
                              if ( $Counter >= // wenn Counter größer oder Gleich 5 dann:
                                 
                              {
                                    
                              /* beschreibung einfügen */

                                    
                              $Counter 0// counter auf 0 setzen

                                 
                              }
                                 else { 
                              // wenn counter kleiner als 5: 0,1,2,3,4 Dann:
                                    /* Bild einfügen */
                                 
                              }

                              Du iterierst über $Folders, was bedeutet das alles zwischen den foreach(...) { <-> } definiert wird, genau so oft ausgeführt wird, wie es einträge in dem an foreach überlieferten Array gibt. Als Wert-Position P ( für die aktuelle Position von $Folder in $Folders ) und dem Counter-Wert C ( also den rellen Wert von $Counter ), sieht die ausgabe dann von deiner Logik so aus:

                              Code:
                              P = 0 -- C = 1 -> Bild
                              P = 1 -- C = 2 -> Bild
                              P = 2 -- C = 3 -> Bild
                              P = 3 -- C = 4 -> Bild
                              P = 4 -- C = 5 -> Beschreibung; C = 0; ABER kein Bild - Folder übersprungen
                              P = 5 -- C = 1 -> Bild
                              P = 6 -- C = 2 -> Bild
                              P = 7 -- C = 3 -> Bild
                              P = 8 -- C = 4 -> Bild
                              P = 9 -- C = 5 -> Beschreibung; C= 0; ABER kein Bild - Folder übersprungen
                              Du missverstehst entweder die else {} Konstruktion von if() und hälst else für einen "Wird immer gemacht"-Default wert, oder hast das schlichtweg übersehen / verdrängt.

                              Beheben würde deine Methode wenn der Else-Block einfach normal im foreach()-Block ausgeführt, du also ganz einfach auf das umliegende else { ... } verzichten würdest.

                              Verständlicher ?

                              Kommentar

                              Lädt...
                              X