Home > Article > Backend Development > Recursively scan directories using PHP5’s DirectoryIterators_PHP Tutorial
PHP5 adds Iterator, a set of ready-made interfaces that help navigate and process 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 be used to 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 List A isDot()) {echo $file . "n" ;}}?>View the output of this code in a 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 However, with PHP5, you only need two new Iterators: RecursiveIterator and RecursiveIteratorIterator, which combine all the above features. See List B: List B At this time, the input result will be List all files and directories under the starting directory. 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 Listing C illustrates the use of DirectoryTreeIterator. List C The following is part of what you see Output result: |-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.
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 your local configuration:
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 deeper and check the content of the next level. This may sound quite complex, and in the past typically required more than 15 lines of code.
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.