Hellihello,
ausgehend von diesen <http://forum.de.selfhtml.org/archiv/2008/8/t175534/#m1154285@Hinweisen zur SPL> bin ich auf einen Artikel aus dem PHP|architecture magazine von Jan 2005 gestoßen. Darin unter anderem
"The SPL extension didn’t get as much buzz as PHP5’s new XML and OOP features, but that didn’t stop it from making it to the final distribution ... .This collection of interfaces and classes ... currently focused on solving one problem—Iterators."
Mit scandir() lässt sich ja nun schön eine rekursive Funktion bauen, die sich selbst wieder aufruft, wenn der aktuelle Eintrag ein directory ist. Das alles geht aber auch mit dem RecursiveDirectoryIterator in Kombination mit dem RecursiveIteratorIterator. Wenn ich es recht sehe, ist es dem RII egal, woher die rekursive Struktur stammt. Nur Datenbanken bilden solche Strukturen rekursiver Art wohl nicht ab (? oder doch, mit JOIN und 1 zu n Struktur, 1 Kunde - 2 Bestellungen - 8 Produkte etc.pp.?).
Immerhin dachte ich, wenn man kapieren will, warum die _Standard_-Bibliothek nur aus Iteratoren besteht (und ein paar Funktionen wie register_autoload() - die aber nischt mit Iteration zu tun hat), könnte man damit ja mal rumexperimentieren. Eine verschachtelte Liste aus dem o.g. zu erstellen habe ich mal versucht, mit alternativerSyntax und HTML-Bausteinen, sowie mit DOMFunktionen. Vielleicht betreibt ja irgendwer sonst außer dedlfix - aber gerne auch wieder dedlfix himself (;-) - noch Recherche auf dem Gebiet und kann irgendwas sinniges dazu beisteuern. Ich kapiere zwar irgendwie, dass diese Iteratoren eine Art von Verallgemeinerung eines Datenstrukturhandlings (unabhängig von ihrer Herkunft) bedeuten soll (bzw. ist, es ist ein "Verhaltensmuster", ein "pattern" wie zB. Factory oder Singleton auch eins ist, aber eben aus dem Bereich "behaviour"), so dass vermutlich u.g. Schablonen auch mit anderen Datenquellen Wiederverwendung finden können, bin mir aber nicht ganz sicher, den "Clou" der Sache wirklich kapiert zu haben.
// set Directory to recursively iterate through
$dir_path = "it_test";
// create instance of RecursiveDirectoryIterator predefined SPL-class
$my_recursive_dir_reader_iterator = new RecursiveDirectoryIterator($dir_path);
// create instance of RecursiveIteratorIterator passing over the recursive DirectoryIterator
$dir_or_file_path = new RecursiveIteratorIterator($my_recursive_dir_reader_iterator, true);
// creating a verschachtelte list using alternative Syntax
?>
<ul>
<?php foreach ( $dir_or_file_path as $file ):;?>
<?php if ($lastDepth > $dir_or_file_path->getDepth()): //on the way back up?>
</ul></li>
<?php endif;?>
<li>
depth: <?php echo $dir_or_file_path->getDepth()?>
name: <?php echo $file;?>
<?php if ($dir_or_file_path->hasChildren()): // subdirectories?>
<ul>
<?php endif;?>
<?php if (!$dir_or_file_path->hasChildren()): // files will get a closing </li>?>
</li>
<?php endif;?>
<?php $lastDepth = $dir_or_file_path->getDepth(); // keep in mind where we come from?>
<?php endforeach;?>
<!-- keine idee, warum da zwei schließende uls hinmüssen...-->
</ul></ul>
<hr>
<?php
// creating a verschachtelte list using DOMFunktions
$dom = new DOMDocument;
$dom->formatOutput = true;
$master_ul_element = $dom->createElement("ul");
$dom->appendChild($master_ul_element);
//iterate recursively through the object
foreach ( $dir_or_file_path as $file ) {
// create li-Element with text
$li = $dom->createElement("li");
$text = "depth: " . $dir_or_file_path->getDepth() . " - name: ". $file;
$textElement = $dom->createTextNode($text);
$li->appendChild($textElement);
// check if on top level, then append to master-ul-element
if ($dir_or_file_path->getDepth() == 0) {
$master_ul_element->appendChild($li);
} else { //if not, append to the one above
$sub_ul_element[$dir_or_file_path->getDepth()-1]->appendChild($li);
}
// if iteration-element has children, create an sub-ul-element
if ($dir_or_file_path->hasChildren()) {
$sub_ul_element[$dir_or_file_path->getDepth()] = $dom->createElement("ul");
$li->appendChild($sub_ul_element[$dir_or_file_path->getDepth()]);
}
}
// some output
echo $dom->saveXML();
Dank und Gruß,