PHP5 adds Iterator, a set of ready-made interfaces that help navigate and handle hierarchical data structures. This is one of the most interesting new features of PHP5.
These Iterators significantly reduce the code required to process an XML document tree or collection of files. A large number of Iterators are used in PHP5, including ArrayIterator, CachingIterator, LimitIterator, RecursiveIterator, SimpleXMLIterator and DirectoryIterator.
DirectoryIterator can quickly and efficiently process files in the directory. With a little more creativity in the coding process, DirectoryIterator can also be used to recursively process nested directory trees. Both tasks can be accomplished using just a few lines of code, a significant improvement over the "standard" approach.
Processing a single-level directory First we start with a simple task: processing a single-level directory. Enter (or copy) the following code (Listing A), modifying the directory path to reflect the local configuration:
Listing A
<?php$it = new DirectoryIterator("/tmp/mystuff");foreach($it as $file) {if ( !$it->isDot()) {echo $file . "n";}}?>View the output of this code in the browser, you will see a list of files in the specified directory. How did this happen? DirectoryIterator provides a predetermined interface for restating the contents of a directory; once the location of the target directory is sampled, it can be treated as a standard PHP array, with each element representing a file in the directory. Note that it uses the isDot () method to filter out the "." and ".." directories respectively.
Handling Nested Directory Trees Handling a nested directory tree recursively is almost as easy. In this case, DirectoryIterator needs to check every object it encounters in the single-level directory to determine whether it is a file or a directory. If it is a directory, go one level deeper to check the content of the next level. This may sound quite complex, and in the past typically required more than 15 lines of code.
However, with PHP5, you only need two new Iterators: RecursiveIterator and RecursiveIteratorIterator, which combine all the above features. See List B:
List B
<?php$it = new RecursiveDirectoryIterator("/tmp");foreach(new RecursiveIteratorIterator($it) as $file) {echo $file . "n";}?>At this time, enter the result All files and directories under the starting directory will be listed. Needless to say, this recursive built-in interface is very convenient if you need to process all files under a specific directory level - for example, recursively compressing a directory tree; or modifying the group/owner permissions of a series of nested files. .
Real-life application: Printing a directory tree Printing a graphical directory tree is a common application of directory recursion. Using Iterator to handle this task is very simple, because the Iterator class documentation contains an instance class written specifically for this application. DirectoryTreeIterator (thanks to Marcus Boerger) provides other improvements to the RecursiveIteratorIterator discussed earlier, in particular ASCII tags representing depth and position in the tree structure.
Listing C illustrates the use of DirectoryTreeIterator.
Listing C
<?php$it = new DirectoryTreeIterator("/tmp/cookbook/");foreach($it as $path) {echo $path . "n";}?>Here is part of the output you see:
|-ch01| |-recipe01| | |-example01.php| | -example02.php| |-recipe02| | |-example01.php| | -example02.php| |-recipe03| | -example01.php... To better understand the value of these DirectoryIterators, try coding the three applications illustrated in this tutorial using standard file and directory functions.