hans: Bildergalerie Problem

Hallo Forum.

Bin gerade dabei, eine Galerie per php zu erstellen.
Sie funktioniert nach folgendem Prinzip:

1. Es wird ein query $dir übergeben, der den Ordner, in der die anzuzeigenden Bilder sind, kennzeichnet.
Also: http://localhost/blabla/index.php?dir=../galerie1/

2. Es wird der Inhalt des übergebenen Ordners mittels scandir() ermittelt. Die ersten zwei Elemente ("." und "..") werden per array_shift() gelöscht. Somit habe ich nur die Dateinamen im Array

3. Es wird per echo() ein tabelle eingeleitet

4. Mit foreach() wird jedes Element des arrays mit <img> so verknüpft, dass dann folgender HTML-Code entsteht:

foreach($files as $bild){
   $bild="<img src="".$dir.$bild."">";

=> <img src="galerie1/image001.jpg">

5. In der foreach-Schleife gibt es eine for()-Schleife, die nach 4 Bildern eine neue <tr> anfängt (davor natürlich die aktuelle <tr> schließt).

Und hier ist das Problem: In der ersten Zeile sind 5 statt 4 Bilder. Aber in allen restlichen sind es vier.
Und es wird immer nur image001.jpg geladen, aber keine fortlaufende Bilder (alle bilder sind im Format image###.jpg gespeichert).

Ich gebe euch am besten mal den Quelltext, damit ihr mein Problem besser versteht:

_____________________________________________________________________

<?php
   // Prüfen, ob Parameter ein Ordner ist

if(is_dir($dir)){

// Alle Dateinamen in Array lesen,
  // erste zwei Elemente ("." und "..") werden gelöscht
   $files = scandir($dir);
    for($i=0;$i<2;$i++){
  array_shift($files);
 }

// Tabelle ausgeben
echo "<table width="100%" border="1">";

foreach($files as $bild){
  // So bearbeiten, dass HTML-Code daraus entsteht
   $bild="<img src="".$dir.$bild."">";

// Dann ausgeben
     echo "\n";
     echo "<tr>";
     echo "\n";

for($i=0;i<4;$i++){

echo "<td>";
 echo $bild;
 echo "</td>";
 echo "\n";

if($i==4){
  echo "</tr>";
  echo "\n";
       echo "<tr>";
       echo "\n";
       $i=0;
 }

}
}

// Tabelle beenden
echo "</table>\n";
   }

// Wenn Parameter keine Galerie ist, Meldung ausgeben und sterben
   else{
    die("Galerie nicht gefunden!");
   }

?>
_____________________________________________________________________

Vielen Dank für die Zeit.

euer hans

  1. Hallo,

    for($i=0;i<4;$i++){

    was soll das? Vielleicht fällt dir der Fehler selbst auf.

    Außerdem kannst du es wesentlich eleganter lösen, indem du nicht innerhalb einer foreach eine for-Schleife verwendest! Das ist redundant - Du kannst doch einfach eine Zählvariable einbauen ($i++), und immer wenn $i%4==0 (siehe dazu Modulus-Operator) beginnst du eine neue Zeile!

    Gruß
    Lachgas

    1. for($i=0;i<4;$i++){

      was soll das? Vielleicht fällt dir der Fehler selbst auf.

      Aaaarghh. Erst denken dann schreiben. Jetzt funktioniert es auch. Aber in jeder Zelle einer Zeile wird immer dasselbe bild angezeigt. Ich weiß warum (in der for-Schhleife verändert sich $bild nicht, somit wird immer nur das gleiche Bild ausgegeben), aber wie kann ich das unterbinden? Ich habe keine ahnung, wie ich das machen kann...

      1. Aber in jeder Zelle einer Zeile wird immer dasselbe bild angezeigt. Ich weiß warum (in der for-Schhleife verändert sich $bild nicht, somit wird immer nur das gleiche Bild ausgegeben), aber wie kann ich das unterbinden? Ich habe keine ahnung, wie ich das machen kann...

        Das ist genau der Punkt, den ich schon in meinem Posting ebend ansprach. Verwende innerhalb der foreach-Schleife keine neue for-Schleife, sondern eben nur eine feine Zählvariable. Das erspart zudem noch erhebliche Serverbelastungen. Überleg mal, du müsstest innerhalb eines Zählvorgangs noch mal zählen!

        Gruß
        Lachgas

        1. Verwende innerhalb der foreach-Schleife keine neue for-Schleife, sondern eben nur eine feine Zählvariable.

          Kannst du mir bitte ein beispiel geben? ich weiß nicht so recht, wie du das meinst.

          1. Hallo,

            Kannst du mir bitte ein beispiel geben? ich weiß nicht so recht, wie du das meinst.

            OK, ausnahmsweise ;-)

            [...]

            foreach($files as $bild){
              // So bearbeiten, dass HTML-Code daraus entsteht
               $bild="<img src="".$dir.$bild."">";

            echo "<td>$bild</td>\n";          // Du musst nicht immer ein neues Echo beginnen!

            $i++;  // Diese Variable "zählt"!
                if($i%4 == 0)
              echo "</tr><tr>";

            [...]

            So einfach ist das!

            Gruß
            Lachgas

            1. Okay, ein bisschen umgebaut:

              echo("<table border="1">\n<tr>");

              foreach($files as $bild){

              $bild="<img src="".$dir.$bild."" width="300">";

              echo "<td>$bild</td>\n";

              $i++;

              // Nach ausgeben von $i beginnt si bei 2 zu zählen, warum?
               if($i==2){
                echo "<tr>\n";
               }

              if($i%4 == 0)
                echo "</tr>\n<tr>\n";
               }

              echo("</table>");

              Ist also im Prinzip dasselbe. Aber jetzt ist das Problem,dass in der ersten Reihe nur zwei Zellen sind. Also wieder das gleiche wie davor... Und ich kann mir einfach nicht herleiten, warum das so ist...

              1. ich gebe entwarnung, es lag an der Variable $i. Sie wurde davor schon benutzt...
                Jetzt funktioniert alles, danke Lachgas.