php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.10.2011, 21:36  
Benutzer
 
Registriert seit: 18.06.2009
Beiträge: 42
PHP-Kenntnisse:
Fortgeschritten
Leichti befindet sich auf einem aufstrebenden Ast
Standard Ausgeben eines rekursiv erstellten Objekts (Verzeichnis)

Hallo!
Ich habe ein Problem. Ich hab mir zwei Objekte geschrieben, welche einen Ordner einlesen, und die ganze Verzeichnisstruktur innerhalb des Ordners auslesen. Das funktioniert soweit auch sehr gut.

Ich erhalte ein Objekt in der folgenden Form:

Zitat:
class Application_Model_Directory
private $directoryName // Name des aktuellen Verzeichnisses
private $subDirectories = array() // Wieder gleiche Objekte mit den Unterordnern
private $files = array() // Dateien in diesem Ordner.
private $parentDir
Nun weis ich leider nicht wie ich dieses Objekt am besten ausgeben könnte? Hier bräucht ich einen denkanstoß, ich würds gern möglichst "schön" machen, eine Idee hätte ich mit einer foreach Schleife in einer while Schleife, allerdings ist das wieder eine hässliche Lösung.

Ausgeben werden solls nämlich in der Richtung:
Hauptordner
-Uordner 1a
--Uordner 2a
--Uordner 2b
--File 1 in Urodner 1a
--File 2 in Urodner 1a
-Uordner 1b
--Uordner 2a
---Uordner 3b

usw...

vielen Dank für jede Hilfe!
Leichti ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 22.10.2011, 21:52  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ohne rekursive Funktion dürfte es kaum möglich sein, die gewünschte Struktur zu erzielen.
Um das einfach prüfbar zu machen würde ich z.B. eine Methode hasChildren() empfehlen.

Den RecursiveDirectoryIterator und die diversen anderen Iterator und Interfaces hast du dir bereits angesehen?
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 22.10.2011, 22:10  
Benutzer
 
Registriert seit: 18.06.2009
Beiträge: 42
PHP-Kenntnisse:
Fortgeschritten
Leichti befindet sich auf einem aufstrebenden Ast
Standard

Den RecursiveDirectoryIterator hab ich mir noch nicht angesehen. Generell habe ich es mit Iteratoren (noch) nicht so .

Ich würde trotzdem gern meine eigene Klasse schreiben/verwenden, macht es Sinn einen Iterator zu implementieren?

Soll ich eine eigene Klasse schreiben, welche über diese Klasse (mit dem Verzeichnisbaum) iteriert? Ich bin irgendwie total planlos.

Die hasChildren() Methode hilft mir leider auch nicht wirklich.

Mein Gedanke ist folgender:
Solange in den "ersten" Unterordner gehen bis es keinen mehr gibt, alle files ausgeben, eins raus, den nächsten nehmen (falls vorhanden).

- Wieder solange rein bis man ganz "drinnen" ist. Nür müsste man die bereits iterierten "streichen"? Hat jemand eine Idee? Ich könnte ein zweites "Streich" Array machen, ist aber bei weitem nicht "best practice".

mfg
Leichti ist offline   Mit Zitat antworten
Alt 22.10.2011, 22:28  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Also irgendwie scheinst Du das Prinzip der Rekursion noch nicht ganz verstanden zu haben*). Dort wird immer eine Ebene komplett abgearbeitet und am Anfang oder Ende in die nächst tiefere gesprungen. Nach Abarbeitung erfolgt ein Rückfall in einen evtl. vorhandenen Aufrufkontext. Die Ergebnisse der Verarbeitungsschritte werden gesammelt - entweder über die jeweiligen Rückgaben oder eine referenzierte Parametervariable.

*) daher auch:

[MOD: verschoben]

RecursiveIteratoren funktionieren etwas anders: Sie stellen erst eine (lineare, also eindimensionale) Liste aller rekursiven Einträge zusammen und iterieren dann über diese flache Hierarchie.

Genauso kannst Du aber auch (nicht recursive) DirectoryIterator verwenden und echte Rekursion. Siehe auch: http://www.robo47.net/codeschnipsel/...atoren-der-SPL
__________________
--
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 22.10.2011, 23:09  
Benutzer
 
Registriert seit: 18.06.2009
Beiträge: 42
PHP-Kenntnisse:
Fortgeschritten
Leichti befindet sich auf einem aufstrebenden Ast
Standard

Ich glaub ich habe es nun! Danke für die Erklärung!

Die ganze Methode sieht jetzt so aus, was meint ihr, ist das ok? (Files hab ich jetzt noch nicht implementiert, aber das ist ja nur mehr eine Zeile.)

PHP-Code:
    public function createTree() {
        
$treeArray = array();
        foreach(
$this->_subDirectories as $directory) {
            
// First push this directories into the tree, then look for subdirectories and -files.
            
$mergeArray = array(array("object" => $directory"deep" => $directory->getDeep()));
            
$treeArray array_merge($treeArray$mergeArray);

            
// If the directory has subDirectories, let us load them.
            
if($directory->hasChildren()) {
                
$subTreeArray $directory->createTree();
                
$treeArray array_merge($treeArray$subTreeArray);
            }           
        }
        
        return 
$treeArray;
    } 
Beim ausgeben prüfe ich dann einfach mit instanceof obs ein Objekt des Typs "File" oder "Directory" ist.

Danke fürs verschieben.

mfg

PS: Keine Beleidungen für mein Englisch bitte :P
Leichti ist offline   Mit Zitat antworten
Alt 22.10.2011, 23:35  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Ach, so schlimm is das doch garnicht.. :P

Zitat:
First, push the directory for the tree, then look if the tree is kaputt. if he is kaputt, use glue and alt-holz to repair him. if not, go weg and hope that the police will not kriegen you.


Da könntest du auch noch den ein oder anderen Blick reinwerfen: http://www.phpro.org/tutorials/Introduction-to-SPL.html
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist gerade online   Mit Zitat antworten
Alt 22.10.2011, 23:48  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Nachdem ich mich gefragt und dann verstanden habe, woher $this->_subDirectories kommt, sehe ich ein Problem darin, dass Du die Methode, den Baum zu durchlaufen in den Baumknoten/im Baum implementierst. Da hier keine gescheite Möglichkeit herrscht, gleich eine Methode auf den aktuellen Knoten auszuführen, statt nur alle in einer schnöden Liste aneinanderzureihen, würde ich Dir raten
a) gleich auf SPL zu setzen
b) den Iterationsprozess aus dem Baum herauszunehmen und ein weiteres Objekt zu schaffen, das über den Baum arbeitet (alternativ kannst Du dann aber auch gleich über ein Live-Directory-Reading laufen)
__________________
--
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
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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Zend_Mail Attachments im ./application/data/uploads Verzeichnis auswählen dreamcatcher PHP Einsteiger 1 13.08.2011 13:07
Rekursiv Verzeichnis durchsuchen _-Tricky-_ PHP Tipps 2010 1 21.04.2010 10:49
Problem bei kategorien rekursiv ausgeben. litterauspirna PHP Tipps 2008 13 08.11.2008 19:25
Menü punkte Rekursiv ausgeben??? shocky PHP Tipps 2006 3 02.07.2006 15:56
Dateien im Verzeichnis zählen und ausgeben.. PHP Tipps 2005 2 01.06.2005 22:14
Verzeichnis -> read() sortiert ausgeben Unbekanntes_Pferd PHP Tipps 2005 9 30.01.2005 20:39

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php recursiveiterator sortieren, ordner dateien in liste php iterieren, php rekursion, php rekursiv verzeichnisse anzeigen, php recursive recursiveiterator sortieren, php ordner rekursiv durchsuchen, php objekt rekursiv iterieren, php objekt ausgeben, php rekursiven array ausgeben, pfad ausgabe array rekursiv, rekursion flach

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:18 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