php.de

Zurück   php.de > php.de Intern > Wiki Diskussionsforum

Antwort
 
LinkBack (3) Themen-Optionen Thema bewerten
Alt 04.10.2008, 23:52  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.798
PHP-Kenntnisse:
Fortgeschritten
robo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblick
Standard

Nur mal so ein Vorschlag, überall sehe ich immer die Methoden via opendir() mit Verzeichnissen zu arbeiten, zusätzlich eine Funktion für Rekursion selbst zu schreiben etc.

Dabei bietet doch php schon seit einiger Zeit auch viel komfortablere und mächtigere Möglichkeiten mit Verzeichnissen und Dateistrukturen umzugehen ohne z.b. bei Rekursion sich seinen Code selbst schreiben zumüssen

Insbesondere die seit php5 vorhandenen Iteratoren der SPL (DirectoryIterator, RecursiveDirectoryIterator) z.b. in Kombination mit dem FilterIterator bieten die Möglichkeit solche Dinge viel einfacher zu handhaben wie ich finde.

Ich fände es schön wenn in der Wiki vielleicht auch die Möglichkeiten mit den Iteratoren erklärt oder zumindest mit ein paar Links aufs Manual erwähnt werden.

(Nein das ist keine Meldung meinerseits das zu übernehmen, nur ein Vorschlag )
robo47 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.10.2008, 23:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Magst Du hier wenigstens einen Ansatz posten? Finde ich interessant. Der vorliegende Beitrag war eher eine spontane Reaktion auf einen aktuellen Thread von heute.

@Manko: Ach nein? Das überrascht mich allerdings. (das mit "geht nicht")
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 04.10.2008, 23:55  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

@robo47: Bin auch dafür. Man kann den Artikel ja zweiteilen. Einmal die prozedurale Variante und einmal die objektorientierte.
Ich finde es übrigens auch genial, dass die SPL ab PHP 5.3 fester Bestandteil von PHP ist und sich nicht mehr deaktivieren lässt. So hat man wenigstens die Aussicht, sie in Software wirklich einsetzen zu können, ohne viele Kunden auszuschließen, da Systemadministratoren ja bekanntermaßen immer alles deaktivieren, was man nur deaktivieren kann.

@nikosch: geht wirklich nicht und mit exit() ist es dasselbe Desaster. Klammern kann man eigentlich nur bei include_(once), require(_once), print und echo komplett und unbedingt weglassen.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems

Geändert von Manko10 (04.10.2008 um 23:58 Uhr).
Manko10 ist offline   Mit Zitat antworten
Alt 06.10.2008, 01:47  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.798
PHP-Kenntnisse:
Fortgeschritten
robo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Magst Du hier wenigstens einen Ansatz posten? Finde ich interessant. Der vorliegende Beitrag war eher eine spontane Reaktion auf einen aktuellen Thread von heute.
Naja, mal ein paar Beispiele, hatte irgendwie grad Lust dazu
(Ich bitte den Stil (Formatierung, Variablenbennungen, etc) zu entschuldingen, soll nur der Demonstration dienen, ist grad so in ein paar Minuten entstanden, kann man also definitiv auch besser/ordentlicher machen )

Dateien auflisten
PHP-Code:
<?php
// Dateien aus Verzeichnis auflisten
echo 'Dateien: <br />';
$iterator = new DirectoryIterator('./files');
foreach(
$iterator as $element) {
    if (
$element->isFile()) {
        echo 
$element->getFilename() . '<br />';
    }
}
?>
Output:

Code:
Dateien:
TestFile8.jpg
TestFile6.txt
TestFile1.txt
TestFile5.jpg
TestFile2.txt
TestFile2.jpg
TestFile3.txt
TestFile4.jpg
TestFile4.txt
TestFile6.jpg
TestFile7.txt
TestFile9.txt
TestFile1.jpg
TestFile9.jpg
TestFile3.jpg
TestFile5.txt
TestFile7.jpg
TestFile8.txt
Verzeichnisse auflisten
PHP-Code:
<?php
// Verzeichnisse auflisten
$iterator = new DirectoryIterator('./files');
echo 
'Verzeichnisse: <br />';

foreach(
$iterator as $element) {
    if (
$element->isDir()) {
        echo 
$element->getFilename() . '<br />';
    }
}
?>
Output:
Code:
Verzeichnisse:
..
files1
files3
files2
.
Verzeichnissestruktur ausgeben (Rekursive Iteratoren)
PHP-Code:
<?php
echo 'Rekursive Verzeichnisse: <br />';
// Rekursiv Verzeichnisse aus Verzeichnis auflisten

$recursiveIterator = new RecursiveDirectoryIterator('./files');
$recursiverecursiveIterator = new RecursiveIteratorIterator($recursiveIterator,RecursiveIteratorIterator::SELF_FIRST);

foreach(
$recursiverecursiveIterator as $element) {
    if (
$element->isDir()) {
        
$depth $recursiverecursiveIterator->getDepth();
        echo 
str_repeat('&nbsp;&nbsp;'$depth);
        echo 
$element->getFilename() . '<br />';
    }
}
?>
Output:
Code:
Rekursive Verzeichnisse:
files1
files3
  files3.2
  files3.1
files2
  files2.2

Verzeichnissestruktur ausgeben mit Dateien (Rekursive Iteratoren)
PHP-Code:
<?php
$recursiveIterator 
= new RecursiveDirectoryIterator('./files');
$recursiverecursiveIterator = new RecursiveIteratorIterator($recursiveIterator,RecursiveIteratorIterator::SELF_FIRST);

echo 
'Rekursive Struktur mit Verzeichnissen und DateienVerzeichnisse: <br />';
// Verzeichnisse aus Verzeichnis auflisten
foreach($recursiverecursiveIterator as $element) {
    if (
$element->isDir() || $element->isFile()) {
        
$depth $recursiverecursiveIterator->getDepth();
        echo 
str_repeat('&nbsp;&nbsp;'$depth);
        echo 
'[' strtoupper($element->getType()) . '] ';
        echo 
$element->getFilename() . '<br />';
    }
}
?>
Output:
Code:
Rekursive Struktur mit Verzeichnissen und Dateien:
[FILE] TestFile8.jpg
[FILE] TestFile6.txt
[FILE] TestFile1.txt
[DIR] files1
  [FILE] TestFile1.1.txt
  [FILE] TestFile1.2.txt
[FILE] TestFile5.jpg
[FILE] TestFile2.txt
[FILE] TestFile2.jpg
[DIR] files3
  [FILE] TestFile1.txt
  [DIR] files3.2
    [FILE] TestFile3.2.2.txt
    [FILE] TestFile3.2.1.txt
  [DIR] files3.1
  [FILE] TestFile1.jpg
[FILE] TestFile3.txt
[FILE] TestFile4.jpg
[DIR] files2
  [FILE] TestFile2.1.txt
  [DIR] files2.2
    [FILE] TestFile2.2.1.txt
    [FILE] TestFile2.2.2.txt
  [FILE] TestFile2.2.txt
[FILE] TestFile4.txt
[FILE] TestFile6.jpg
[FILE] TestFile7.txt
[FILE] TestFile9.txt
[FILE] TestFile1.jpg
[FILE] TestFile9.jpg
[FILE] TestFile3.jpg
[FILE] TestFile5.txt
[FILE] TestFile7.jpg
[FILE] TestFile8.txt


Da die Iteratoren keinerlei Optionen zur Sortierung bieten, hier noch ein paar Beispiele wie man den output sortieren kann:

Sortierte Ausgabe eines Verzeichnisinhalts
PHP-Code:
<?php

$iterator 
= new DirectoryIterator('./files');
$data = new ArrayObject();
// erstellen eines ArrayObjects mit den SplFileInfo-Objekten
foreach($iterator as $value)
{
    
$data[$iterator->getFilename()] = $iterator->getFileInfo();
}
// sortieren
$data->ksort();

// ausgeben
foreach($data as $key=> $value)
{
    echo 
$value->getFilename() . ' (Size: ' $value->getSize() . ' ) ' '<br />';
}
?>

Output:
Code:
. (Size: 4096 )
.. (Size: 4096 )
TestFile1.jpg (Size: 2 )
TestFile1.txt (Size: 2 )
TestFile2.jpg (Size: 2 )
TestFile2.txt (Size: 2 )
TestFile3.jpg (Size: 2 )
TestFile3.txt (Size: 2 )
TestFile4.jpg (Size: 2 )
TestFile4.txt (Size: 2 )
TestFile5.jpg (Size: 2 )
TestFile5.txt (Size: 2 )
TestFile6.jpg (Size: 2 )
TestFile6.txt (Size: 2 )
TestFile7.jpg (Size: 2 )
TestFile7.txt (Size: 2 )
TestFile8.jpg (Size: 2 )
TestFile8.txt (Size: 2 )
TestFile9.jpg (Size: 2 )
TestFile9.txt (Size: 2 )
files1 (Size: 4096 )
files2 (Size: 4096 )
files3 (Size: 4096 )
Sortierte Ausgabe eines Verzeichnisinhalts mit Dateien und Ordnern getrennt
PHP-Code:
<?php
// Ordner zuerst, dann Dateien
$iterator = new DirectoryIterator('./files');
$directorys = new ArrayObject();
$files = new ArrayObject();
// erstellen eines ArrayObjects mit den SplFileInfo-Objekten
foreach($iterator as $value)
{
    if (
$value->isDir()) {
        
$directorys[$value->getFilename()] = $value->getFileInfo();
    } elseif (
$value->isFile()) {
        
$files[$value->getFilename()] = $value->getFileInfo();
    }
}
// Dateien und Ordner sortieren
$directorys->ksort();
$files->ksort();

// zusammenfügen (Verzeichnisse zuerst)
$data array_merge((array)$directorys, (array)$files);

// ausgeben
foreach($data as $key=> $value) {
    echo 
'[' $value->getType() . '] '$value->getFilename() . ' (Size: ' $value->getSize() . ' ) ' '<br />';
}
Output:
Code:
[dir] . (Size: 4096 )
[dir] .. (Size: 4096 )
[dir] files1 (Size: 4096 )
[dir] files2 (Size: 4096 )
[dir] files3 (Size: 4096 )
[file] TestFile1.jpg (Size: 2 )
[file] TestFile1.txt (Size: 2 )
[file] TestFile2.jpg (Size: 2 )
[file] TestFile2.txt (Size: 2 )
[file] TestFile3.jpg (Size: 2 )
[file] TestFile3.txt (Size: 2 )
[file] TestFile4.jpg (Size: 2 )
[file] TestFile4.txt (Size: 2 )
[file] TestFile5.jpg (Size: 2 )
[file] TestFile5.txt (Size: 2 )
[file] TestFile6.jpg (Size: 2 )
[file] TestFile6.txt (Size: 2 )
[file] TestFile7.jpg (Size: 2 )
[file] TestFile7.txt (Size: 2 )
[file] TestFile8.jpg (Size: 2 )
[file] TestFile8.txt (Size: 2 )
[file] TestFile9.jpg (Size: 2 )
[file] TestFile9.txt (Size: 2 )
Und jetzt wollen wir ja auch noch filtern, in diesem Beispiel wollen wir nur
Dateien mit der Endung .txt (Lässt sich natürlich beliebig erweitern, Dateigröße
, Alter, Datum der letzten Bearbeitung oder sonstiges)
Dazu müssen wir einen eigenen FilterIterator auf Basis der abstrakten Klasse
FilterIterator basteln und dort die abstrakte methode accept() implementieren

PHP-Code:
<?php
/**
 * Filter um aus einem DirectoryIterator nur die Elemente rauszufiltern,
 * die die eine Datei sind mit der Endung .txt
 */
class myTxtOnlyFilterIterator extends FilterIterator
{
    public function 
accept()
    {
        
$current $this->current();
        
// nur dateien sind erlaubt
        
if ($current->getType() !== 'file') {
            return 
false;
        }
        
$filename $current->getFilename();
        
$fileInfo pathinfo($filename);

        if (empty(
$fileInfo['extension'])) {
            
// wenn sie keine Endung hat
            
return false;
        } elseif (
strtolower($fileInfo['extension']) == 'txt') {
            
// wenn es txt ist
            
return true;
        } else {
            
// eine andere Endung
            
return false;
        }
    }
}

$iterator = new myTxtOnlyFilterIterator(new DirectoryIterator('./files'));
$data = new ArrayObject();
// erstellen eines ArrayObjects mit den SplFileInfo-Objekten
foreach($iterator as $value) {
    
$data[$iterator->getFilename()] = $iterator->getFileInfo();
}
// sortieren
$data->ksort();

// ausgeben
foreach($data as $key=> $value) {
    echo 
$value->getFilename() . ' (Size: ' $value->getSize() . ' ) ' '<br />';
}
Output:
Code:
TestFile1.txt (Size: 2 )
TestFile2.txt (Size: 2 )
TestFile3.txt (Size: 2 )
TestFile4.txt (Size: 2 )
TestFile5.txt (Size: 2 )
TestFile6.txt (Size: 2 )
TestFile7.txt (Size: 2 )
TestFile8.txt (Size: 2 )
TestFile9.txt (Size: 2 )
Ach ja für jeden der sich für Iteratoren und allgemein für die SPL interessiert, kann ich empfehlen hier mal zu schauen:
http://www.php.net/~helly/php/ext/spl/main.html
auch wenn das von 2007 ist, findet man dort zu dem was die SPL aktuell bietet wie ich finde viel mehr und viel detailliertere Informationen als im php Manual.

Geändert von robo47 (06.10.2008 um 06:37 Uhr).
robo47 ist offline   Mit Zitat antworten
Alt 06.10.2008, 06:54  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Wußte nicht, das es direkt nen DirectoryIterator gibt. Sieht vielversprechend aus, danke für die Arbeit. Kommt auf jeden Fall mit rein, die Kombination aus beidem ist eigentlich genau das, was mir fürs Wiki vorschwebt.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 26.10.2008, 21:43  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Wußte nicht, das es direkt nen DirectoryIterator gibt. Sieht vielversprechend aus, danke für die Arbeit. Kommt auf jeden Fall mit rein, die Kombination aus beidem ist eigentlich genau das, was mir fürs Wiki vorschwebt.
spl ist doch ne wahre fundgrube...

vergesst aber das exception handling nicht!
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

LinkBacks (?)
LinkBack to this Thread: http://www.php.de/wiki-diskussionsforum/47879-verzeichnis-auslesen.html
Erstellt von For Type Datum
Klasse um rekursiv Verzeichnisse auszulesen - Developer's Guide This thread Refback 19.10.2008 17:39
Klasse um rekursiv Verzeichnisse auszulesen - Developer's Guide This thread Refback 13.10.2008 19:50
wiki/: Blogs, Photos, Videos and more on Technorati This thread Refback 05.10.2008 01:49

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Verzeichnis auslesen -> Dateinamen in Array quoba PHP Tipps 2008 11 29.04.2008 16:21
Beim Verzeichnis auslesen Dateinamen unterscheiden Teela PHP Tipps 2008 17 28.04.2008 22:05
Verzeichnis auslesen und Dateien öffnen jacos PHP Tipps 2006 1 26.06.2006 10:53
Verzeichnis auslesen... madSoul PHP Tipps 2006 9 03.04.2006 16:01
Verzeichnis auslesen saibot PHP Tipps 2005-2 8 09.08.2005 12:22
[Erledigt] Verzeichnis auslesen / redundante Daten PHP Tipps 2005 6 25.05.2005 13:28
verzeichnis auslesen... StartUpBoy PHP Tipps 2005 13 29.03.2005 15:54
Fehlersuche: Ordner aus Verzeichnis auslesen DannyD PHP Tipps 2004-2 6 19.11.2004 20:36
User Verzeichnis auslesen PHP-Fortgeschrittene 5 29.10.2004 00:48
[Erledigt] Problem mit Verzeichnis auslesen PHP-Fortgeschrittene 7 20.10.2004 21:50
[Erledigt] Verzeichnis andersrum auslesen PHP Tipps 2004 7 02.08.2004 07:39
verzeichnis auslesen Trumpfass PHP Tipps 2004 2 28.07.2004 21:37
Probleme beim Verzeichnis auslesen. Tutti PHP Tipps 2004 8 26.07.2004 15:41
Verzeichnis auslesen PHP Tipps 2004 4 26.07.2004 12:33
Verzeichnis auslesen und in menu einfügen PHP-Fortgeschrittene 1 08.06.2004 00:16

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
directoryiterator sort, recursivedirectoryiterator sort, php verzeichnisse dateien rekursiv auslesen, php recursiveiterator, php rekursiv ordner auslesen, rekursiv iterator objekt php, php recursivedirectoryiterator sort, recursivedirectoryiterator sortieren, php directoryiterator sort, recursiveiteratoriterator::self_first, php ordner rekursiv auflisten, php verzeichnis rekursiv auslesen, directoryiterator dateiendung, php dateien rekursiv auflisten, directoryiterator sorting, php rekursiv verzeichnis auslesen, php ordner rekursiv auslesen, splfileinfo extension, recursiveiterator php, directoryiterator sortieren

Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum