Scandir alles ausser Image raus- filtern

hups1803

Erfahrenes Mitglied
Hallo,
ich habe ein Script um Ordner auszulesen,

nun möchte ich gerne das er nur jpg ,gif,und png anzeigt .

Immoment zeigt er laae an und wenn ich ein Image tag mache gibt es da nun Probleme

PHP:
$ordner = "galleries"; //auch Pfade möglich ($ordner = "download/files";)
//require_once 'scandir_fallback.php';
function ordnerinhalt($folder='galleries') {
    $content = "";
 
    foreach(scandir($folder) as $file) {
        if($file[0] != '.') { // Versteckte Dateien nicht anzeigen
            if(is_dir($folder.'/'.$file)) {
                $folderArray[] = $file;
            } else {
                $fileArray[] = $file;
            }
        }
    }
 
    // Erst die Ordner ausgeben
    if(isset($folderArray)) {
        foreach($folderArray as $row) {
            //$content .= '<b>'.$row.'</b><br />';
            $content .= '<div style="padding-left:10px;color:#afafaf" />'; //Unterordner nach Rechts einrücken
            $content .= ordnerinhalt($folder.'/'.$row); // rekursive Funktion
            $content .= '</div>';
        }
    }
 
    // ...dann die Dateien ausgeben
    if(isset($fileArray)) {
        foreach($fileArray as $row) {
            //$content .= '<a href="'.$folder.'/'.$row.'">'.$row.'</a><br />'; //Dateien verlinken
            $content .= '<img src="'.$folder.'/'.$row.'" width="50">'; //Dateien verlinken
        }
    }
 
    // Rekursion ende
    return $content;
}
 
echo ordnerinhalt();
 
Man kann natürlich auch mit Kanonen auf Spatze schießen.

PHP:
<?php

function getFiles($dir){
	if ($handle = opendir($dir)) {
	    while (false !== ($file = readdir($handle))) {
	    	$ext = explode(".",$file);
	    	$ext = array_slice($ext,-1,1);
	    	$ext = $ext[0];
	        $extArray = array("jpg","png","gif");
	
	        if ($file != "." && $file != ".." && in_array($ext,$extArray)) {
	            echo "<img src='$dir."/".$file' width='50'>";
	        }
	    }
	    closedir($handle);
	}
}

echo getFiles("meinOrdner");
?>
 
Zuletzt bearbeitet:
das haut nicht hin er zeigt nix an

PHP:
function getFiles($dir){
    if ($handle = opendir($dir)) {
        while (false !== ($file = readdir($handle))) {
            $ext = explode(".",$file);
            $ext = array_slice($ext,-1,1);
            $ext = $ext[0];
            $extArray = array("jpg","png","gif");
    
            if ($file != "." && $file != ".." && in_array($ext,$extArray)) {
                echo "<img src='$dir."/".$file' width='50'>";
            }
        }
        closedir($handle);
    }
}

echo getFiles("galleries/");
 
Sry dummer Fehler von meiner Seite.
Habe die Anführungszeichen falsch gesetzt, das kann so auch nicht funktionieren (das Syntax-Highlighting verräts schon) ;)

Änder mal
PHP:
echo "<img src='$dir."/".$file' width='50'>";
in
PHP:
echo '<img src="'.$dir.'/'.$file.'" width="50">';

So sollte es klappen.
In deinem Fall würde es zwar gehen, allerdings auch eine Url mit 2 Slashes zeigen (funktioniert, sieht aber unschön aus). Schreib also dein galleries/ mal ohne Slash ;)

Gruß
 
Zuletzt bearbeitet:
lol geht immer noch nicht ,zeigt nix an

PHP:
function getFiles($dir){
    if ($handle = opendir($dir)) {
        while (false !== ($file = readdir($handle))) {
            $ext = explode(".",$file);
            $ext = array_slice($ext,-1,1);
            $ext = $ext[0];
            $extArray = array("jpg","png","gif");
    
            if ($file != "." && $file != ".." && in_array($ext,$extArray)) {
               echo '<img src="'.$dir.'/'.$file.'" width="50">';  
            }
        }
        closedir($handle);
    }
}

echo getFiles("galleries/");


habe mal diese script gefunden das geht soweit nur leider fehlt da der filter er zeigt alles an was in den ordner ist .txt und php


PHP:
function read_recursiv($path) 
   { 
      $result = array();

      $handle = opendir($path); 

      if ($handle) 
      { 
         while (false !== ($file = readdir($handle))) 
         { 
             if ($file != "." && $file != "..") 
             { 
                $name = $path . "/" . $file;
                if (is_dir($name))
                { 
                   $ar = read_recursiv($name);
                   foreach ($ar as $value)
                   {
                      $result[] = $value;
                   }
                } 
                else 
                { 
                   $result[] = $name;
                } 
             } 
         } 
      } 
      closedir($handle);
      return $result; 
   } 

   $data = read_recursiv("galleries"); 
 
   echo "<b>" . count($data) . "Dateien gefunden</b><br>\n";
   foreach($data as $value)
     echo "<img src='$value' width='50'><br>\n";

habe es jetzt so gemacht was aber nicht so gut ist da ich nicht immer weiss was da an files noch so drinn sein kann.

PHP:
if ($file != "." && $file != ".." && $file != "_info.txt"&& $file != "index.php")
 
Guten Abend,

das Script ist nun doch schon etwas älter, jedoch kann ich villeicht dem ein oder anderen noch helfen.

Habe dir mal eine Funktion geschrieben:

Beschreibung:

array get_filelist(string $dir, string $type oder array $type)

Code:

PHP:
function get_filelist($dir, $type)
{
  
  //INITALISIERUNG
  $handle = '';
  $ausgabe = '';    
  $array = '';
  $data_array = '';
  $type_is_array = false;
  
  //VERZEICHNIS SCANNEN  
  $array = scandir($dir);
  
  //SCAN ERFOLGREICH?
  if(!$array || !is_array($array))
    {return false;}
   
  //PRÜFEN OB PARAMETER 'TYPE' EIN ARRAY IST 
  if(is_array($type))
    {$type_is_array = true;}

  //VERZEICHNIS-SCAN ARRAY AUSLESEN    
  foreach($array as $index => $content)
    {
      //WENN PARAMETER 'TYPE' KEIN ARRAY IST
      if(!$type_is_array)
        {
          //ELEMENTE MIT GÜLTIGEM 'TYPE' IN ARRAY SCHREIBEN
          if(strpos($content,$type)!==false)
             {$data_array[] = $content;}
        }
      //WENN PARAMETER 'TYPE' EIN ARRAY IST
      else
        {  
          //TYPE ARRAY AUSLESEN
          foreach($type as $format)
            {
              //ELEMENTE MIT GÜLTIGEM 'TYPE' IN ARRAY SCHREIBEN
              if(strpos($content,$format)!==false)
                {$data_array[] = $content;}  
            }
        }
    }
  
  //ÜBERPRÜFUNG DES DATEN ARRAYS    
  if(!is_array($data_array) && empty($data_array))
    {return false;}
  //AUSGABE: DATEN ARRAY
  else
    {return $data_array;}
}

Wie verwende ich diese Funktion?

Beispiel 1: (Mehrere Dateitypen)

type: .png, .gif
verzeichnis: Das derzeitige Verzeichnis

PHP:
get_filelist(getcwd(), array(".png", ".gif"));

Beispiel 2: (Nur ein Dateityp)

type: .php
verzeichnis: Das derzeitige Verzeichnis

PHP:
get_filelist(getcwd(), ".php");

//getcwd: http://www.php.net/manual/de/function.getcwd.php

Ausgabe:

Bei erfolg erhält man einen Array.

Dieser kann beispielsweise so ausgegeben werden:

PHP:
$filelist = get_filelist(getcwd(), array(".php"));

if($filelist)
  {
    echo "<ul>";
    foreach($filelist as $index => $content)
      {
        echo "<li><a href='" . $content . "'>" . $content . "</a></li>";  
      }
    echo "</ul>";
  }

Hoffe ich konnte helfen.

MfG Isset
 
Hi isset.

Der Ansatz den du hast ist gut. Ich habe aber noch einige Bedenken in deinem Code.

item: Warum initialisierst du deine Arrays als String? Ich würde diese wenn dann als leeren Array initialisieren. $data_array = array();

item: Bei deinem letzten Beispiel prüfst du if($filelist). Naja, nicht gerade die elegante und saubere Art um herauszufinden ob das Resultat false oder ein Array ist
PHP:
if(is_array($filelist)){}
//oder
if($filelist !== false){}
Auch das Resultat von scandir() würde ich so auswerten

item: Das setzen von $type_is_array kannst du vereinfachen
PHP:
$type_is_array = is_array($type);

item: Die Unterscheidung im späteren Verlauf des Scripts on $type ein Array ist oder nicht, würde ich weglassen. Stattdessen aus dem Type immer ein Array machen. Das erspart die Unterscheidung.
PHP:
if(!is_array($type)) $tyle = array($type);

item: Du prüfst mit strpos() auf die Endung. Das kann zu fehler führen.
PHP:
// Das folgende Beispiel ergibt TRUE obwohl es eine txt-Endung hat
echo strpos('gif', 'Ich.bin.kein.gif.txt');

item: Du prüfst nirgens ob es sich um eine Datei oder ein Ordner handelt.


So würde ich das umsetzen
PHP:
/**
 * @param String        Verzeichnis das durchsucht werden soll
 * @param Variant       Ein String mit der Dateiendung (ohne Punkt) oder ein Array mit mehreren Dateiendungen 
 * @return false oder Array<String>
 */
function getFilelistExcludeTypes($dir, $excludeTypes){
    // Die Ausgabeliste initialisieren
    $validFiles = array();
    
    // Sicherstellen das $types ein Array mit Typen ist
    if(!is_array($excludeTypes)) $excludeTypes = array($excludeTypes);
    
    //Dateien auslesen
    $filenames = scandir($dir);    
    //Falls der Scandir einen Fehler zurückgibt, gib false aus
    if($filenames === false) return false;
    
    foreach($filenames as $filename){
        // Prüfen ob die Endung nicht in der Liste ist und ob es sich um eine Datei handelt.
        // Dateiname mit '.' in seine Einzelteile zerlegen
        $nameParts = explode('.', $filename);
        // Mit end() den letzten Wert, also die Dateiendung auslesen und mit dem Typenarray vergleichen
        if(!in_array(end($nameParts), $excludeTypes) && is_file($filename)){
            //In unsere Ausgabeliste aufnehmen
            $validFiles[] = $filename;
        }
    }
    
    //Wenn keine Dateien gefunden ist mit False beenden
    if(count($validFiles) === 0) return false;    
    // Ansonsten die Dateiliste ausgeben
    return $validFiles;    
}

Oder über Array-Funktionen
PHP:
/**
 * @param String        Verzeichnis das durchsucht werden soll
 * @param mixed         Ein String mit der Dateiendung (ohne Punkt) oder ein Array mit mehreren Dateiendungen 
 * @return mixed        false oder Array<String>
 */
function getFilelistExcludeTypes($dir, $excludeTypes){
    // Die Ausgabeliste initialisieren
    $validFiles = array();
    
    // Sicherstellen das $types ein Array mit Typen ist
    if(!is_array($excludeTypes)) $excludeTypes = array($excludeTypes);
    
    // Dateien auslesen
    $filenames = scandir($dir);    
    // Falls der Scandir einen Fehler zurückgibt, gib false aus
    if($filenames === false) return false;
    
    // Alle Nicht-Dateien ausfiltern
    $filenames = array_filter($filenames, 'is_file');

    // Bei jeder Datei die Dateiendung ermitteln.Dann zu einem Array zusammensetzen 
    // dessen Key der Dateiname und der Wert die Endung ist
    $files = array_combine($filenames, array_map('getFileTypeByName', $filenames));
    // Nur diejenigen nehmen die nicht im Array $excludeTypes vorhanden sind
    $files = array_diff($files, $excludeTypes);
    // Die Dateinamen aus dem Key auslsesen
    $validFiles = array_keys($files);
    // Wenn keine Dateien gefunden ist mit False beenden
    if(count($validFiles) === 0) return false;    
    // Ansonsten die Dateiliste ausgeben
    return $validFiles;    
}

/**
 * @param String    Dateiname
 * @return Sring    Dateiendung
 */
function getFileTypeByName($filename){
    $nameParts = explode('.', $filename);    
    return end($nameParts);
}
 
Zurück