Wie Lese Ich bilder verzeichnis mit Objektorientierung

Umar1190

Grünschnabel
hallo,

Ich möchte nur wissen wie kann ich ein Bilder verzeichnis mit oop lesen. Funksional habe

ich es hinbekommen, aber ich weis nicht wie ich das mit oop realisieren sollte. bin seit 2

tagen dadrauf und bekomme es leider nicht hin.

Funksional Code

PHP:
                $Bilder = array();
                $Ordner = "img/gallery";
                $dateiendungen = array("png", "jpg" ,"jepg");
                $anzahl = 25;
                $nummern = array();

                $ordner = opendir($Ordner);
                while ($Datei = readdir($ordner)) {
                    if (!is_dir($Datei)) {
                        if ($Datei != "..") {
                            if (strstr($Datei, ".")) {
                                $punkt = strrpos($Datei, ".");
                                $endung = strtolower(substr($Datei, $punkt + 1));

                                if (in_array($endung, $dateiendungen)) {
                                    $Bilder[] = $Ordner . "/" . $Datei;
                                }
                            }
                        }
                    }
                }
                closedir($ordner);

                $anzahlbilder = count($Bilder) - 1;
                if ($anzahl > $anzahlbilder) {
                    $anzahl = $anzahlbilder;
                }

                for ($i = 1; $i <= $anzahl; $i++) {
                    srand(microtime() * 1000000);
                    $nummer = rand(0, $anzahlbilder);
                    if (!in_array($nummer, $nummern)) {
                        $nummern[] = $nummer;
                        echo "<a href='$Bilder[$nummer]' rel=lightbox[roadtrip] 

style='height: 200px; width: 140px;'><img src=\"" . $Bilder[$nummer] . "\"/></a>";
                    } else {
                        $i--;
                    }
                }


Diese Script klappt auch sehr gut aber ich bin nur am lernen wie oop funsuniert. Login
system habe ich mit oop gut hinbekommen aber das mit verzeichnis lesenen da komme ich echt nicht weiter.
 
Versuch das mal (nicht ausprobiert):
PHP:
$pictures   = array();
$directory  = 'img/gallery';
$extensions = array('png', 'jpg', 'jpeg');
$count      = 25;
$numbers    = array();

$iterator = new DirectoryIterator($directory);
while($iterator->valid()) {
  if($iterator->isFile() && in_array($iterator->getExtension(), $extensions)) {
    $pictures[] = $directory . '/' . $iterator->current();
  }
}

$count_pictures = count($pictures) - 1;
if($count > $count_pictures) {
  $count = $count_pictures;
}

srand(microtime() * 1000000);

$numbers = shuffle(range(0, $count_pictures));
$i = 0;

foreach($numbers as $number) {
  if($i === $count) {
    break;
  } else {
    echo '<a href="' . $pictures[$number] . '" rel="lightbox[roadtrip]" style="height: 200px; width: 140px;"><img src="' . $pictures[$number] . '" /></a>';
  }
}
 
Zuletzt bearbeitet:
Naja das ist aber nicht oop programmierung. Ich dachte oop (objektorientierung programmierung) ist immer mit opjekte und fängt immer mit class. Was du geschrieben hast sieht auch eher nach funksional und nicht oop. Ich habe aber getestet es geht nicht. Und auserdem ich brauche nicht funksinal, weil das habe ich ja auch hinbekommen. Aber danke das du mir helfen wolltest.
 
Mh, du wirst es in PHP nicht erleben, dass du etwas rein in OOP schreibst, da PHP einfach nicht komplett OOP-gerecht ist. Somit wirst du immer den Fall haben, dass du Schleifen und Bedingungen hast, die logischerweise nicht OOP sind. Außerdem hat OOP in PHP in erster Linie nichts mit class gemein, da man dass nicht braucht, wenn es schon existiert (siehe DirectoryIterator). Im Übrigen wüsste ich gerne, welche Fehlermeldungen dir PHP anzeigt. Dann kann ich dein Problem auch ausbessern.

PHP:
class Pictures implements Iterator {
  private $pictures = array();
  private $indices = array();
  
  public function __construct($directory, $extensions, $count) {
    $iterator = new DirectoryIterator($directory);
    while($iterator->valid()) {
      if($iterator->isFile() && in_array($iterator->getExtension(), $extensions)) {
        $this->pictures[] = $directory . '/' . $iterator->current();
      }
    }
   
    $count_pictures = count($pictures) - 1;
    if($count > $count_pictures) {
      $count = $count_pictures;
    }
    
    srand(microtime() * 1000000);
    
    $this->indices = array_slice(shuffle(range(0, $count_pictures)), 0, $count);
  }

  public function current() {
    return $this->pictures[current($this->indices)];
  }
  
  public function key() {
    return $this->indices;
  }
  
  public function next() {
    return next($this->indices);
  }
  
  public function rewind() {
    return reset($this->indices);
  }

  public function valid() {
    return ($this->current() !== false);
  }
}

$pictures = new Pictures('img/gallery', array('png', 'jpg', 'jpeg'), 25);
foreach($pictures as $pictures) {
  echo '<a href="' . $picture . '" rel="lightbox[roadtrip]" style="height: 200px; width: 140px;"><img src="' . $picture . '" /></a>';
}
 
Aso ich habe schon von mein kumppel mit bekommen das php oop anders ist als java oop. Also damit meinte er das php nicht reif ist mit oop zumindest nicht so mächtig wie java in oop.

Ich habe mal dein script eingesetzt, aber es kam folgender fehler:

Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\bweb\testen\index.php on line 31
 
Oh, verdammt. Ich habe da auch eine endlos Schleife eingebaut. Es müsste als letzter Befehl in der ersten Schleife noch ein $iterator->next() stehen.
 
Aber kommischerweise kommt das fehler weiterhin:

Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\bweb\testen\index.php on line 31

ich denke ich mache da was falsch.
 
Mh, du wirst es in PHP nicht erleben, dass du etwas rein in OOP schreibst, da PHP einfach nicht komplett OOP-gerecht ist. Somit wirst du immer den Fall haben, dass du Schleifen und Bedingungen hast, die logischerweise nicht OOP sind.
Hmm, das sehe ich aber ganz anders. In PHP kann man sehr schön (auch 100%) objektorientiert arbeiten. Schleifen und Bedingungen gibt es bei OOP in den Methoden auch an jeder Ecke, sagt also nichts darüber aus ob es OOP ist oder nicht.

Aso ich habe schon von mein kumppel mit bekommen das php oop anders ist als java oop. Also damit meinte er das php nicht reif ist mit oop zumindest nicht so mächtig wie java in oop.
Der größte Nachteil von PHP ist, dass die Objekte nicht so langlebig sind wie bei Desktopanwendungen und die Kommunikation zwischen den Objekten nicht so schön modelliert werden kann.

Aber kommischerweise kommt das fehler weiterhin:

Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\bweb\testen\index.php on line 31

ich denke ich mache da was falsch.
Poste doch mal was in Zeile 31 steht. :)

Gruß

//EDIT
Btw, der Fehler sagt auch nur, dass in Zeile 31 etwas ist was er in 30 Sekunden nicht abarbeiten kann. (evtl eine Endlosschleife?)
 
Aha ok.

Also in line 31 steht nur das :

PHP:
      if($iterator->isFile() && in_array($iterator->getExtension(), $extensions)) {
        $this->pictures[] = $directory . '/' . $iterator->current();
      }

Das erste line ist in line 31 bei mir lol
 
So geht es jetzt wirklich (ausprobiert!):
PHP:
class Pictures implements Iterator {
  private $pictures = array();
  
  public function __construct($directory, $extensions, $count) {
    $iterator = new DirectoryIterator($directory);
    foreach($iterator as $file) {
      if($file->isFile() && in_array(substr(strrchr($file->getFilename(), '.'), 1), $extensions)) {
        $this->pictures[] = $directory . '/' . $file->getFilename();
      }
    }
    
    $count_pictures = count($this->pictures) - 1;
    if($count > $count_pictures) {
      $count = $count_pictures;
    }
    
    srand(microtime() * 1000000);
    
    shuffle($this->pictures);
    $this->pictures = array_values(array_slice($this->pictures, 0, $count));
  }
  
  public function current() {
    return current($this->pictures);
  }
  
  public function key() {
    return key($this->pictures);
  }
  
  public function next() {
    return next($this->pictures);
  }
  
  public function rewind() {
    return reset($this->pictures);
  }
  
  public function valid() {
    return ($this->current() !== false);
  }
}

$pictures = new Pictures('img/gallery', array('png', 'jpg', 'jpeg'), 25);
foreach($pictures as $picture) {
  echo '<a href="' . $picture . '" rel="lightbox[roadtrip]" style="height: 200px; width: 140px;"><img src="' . $picture . '" /></a>';
}
 
Zurück