diff options
author | Marcus Boerger <helly@php.net> | 2003-07-16 20:18:33 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2003-07-16 20:18:33 +0000 |
commit | 49277b2ac6ab8175a64174174daddbc3413bbee3 (patch) | |
tree | 4578fe1e94e9a0bd210a131d9afad01e84fa3be1 | |
parent | 1131d43b0bbf52548e5298bf8b444cef0556954c (diff) | |
download | php-git-49277b2ac6ab8175a64174174daddbc3413bbee3.tar.gz |
More examples
-rwxr-xr-x | ext/spl/examples/filter.inc | 92 | ||||
-rwxr-xr-x | ext/spl/examples/filter_tree.php | 20 | ||||
-rwxr-xr-x | ext/spl/examples/sub_dir.inc | 116 |
3 files changed, 228 insertions, 0 deletions
diff --git a/ext/spl/examples/filter.inc b/ext/spl/examples/filter.inc new file mode 100755 index 0000000000..23fe38cbae --- /dev/null +++ b/ext/spl/examples/filter.inc @@ -0,0 +1,92 @@ +<?php + +/** + * @brief Regular expression filter for string iterators + * @author Marcus Boerger + * @version 1.0 + * + * Instances of this class act as a filter around iterators whose elements + * are strings. In other words you can put an iterator into the constructor + * and the instance will only return elements which match the given regular + * expression. + */ +class filter implements spl_forward +{ + protected $it; + protected $regex; + protected $curr; + + /** + * Constructs a filter around an iterator whose elemnts are strings. + * If the given iterator is of type spl_sequence then its rewind() + * method is called. + * + * @param it Object that implements at least spl_forward + * @patam regex Regular expression used as a filter. + */ + function __construct(spl_forward $it, $regex) { + if ($it instanceof spl_sequence) { + $it->rewind(); + } + $this->it = $it; + $this->regex = $regex; + $this->fetch(); + } + + /** + * Destruct the iterator. + */ + function __destruct() { + unset($this->it); + } + + /** + * Fetch next element and store it. + * + * @return void + */ + protected function fetch() { + $this->curr = false; + while ($this->it->has_more()) { + $curr = $this->it->current(); + if (ereg($this->regex, $curr)) { + $this->curr = $curr; + return; + } + $this->it->next(); + }; + } + + /** + * Move to next element + * + * @return void + */ + function next() { + $this->it->next(); + $this->fetch(); + } + + /** + * @return Whether more elements are available + */ + function has_more() { + return $this->curr !== false; + } + + /** + * @return The current value + */ + function current() { + return $this->curr; + } + + /** + * hidden __clone + */ + protected function __clone() { + // disallow clone + } +} + +?>
\ No newline at end of file diff --git a/ext/spl/examples/filter_tree.php b/ext/spl/examples/filter_tree.php new file mode 100755 index 0000000000..8ee4cef556 --- /dev/null +++ b/ext/spl/examples/filter_tree.php @@ -0,0 +1,20 @@ +<?php + +/* tree view example + * + * Usage: php filter_tree.php <path> <regex> + * + * Simply specify the path to tree with parameter <path>. + * The regular expression <regex> is used to filter the tree. + * + * (c) Marcus Boerger + */ + +require_once("sub_dir.inc"); +require_once("filter.inc"); + +foreach(new filter(new sub_dir($argv[1]), $argv[2]) as $f) { + echo "$f\n"; +} + +?>
\ No newline at end of file diff --git a/ext/spl/examples/sub_dir.inc b/ext/spl/examples/sub_dir.inc new file mode 100755 index 0000000000..74477c82eb --- /dev/null +++ b/ext/spl/examples/sub_dir.inc @@ -0,0 +1,116 @@ +<?php + +/** + * @brief Subdirectory aware directory iterator. + * @author Marcus Boerger + * @version 1.0 + * + * This directory iterator recursively returns all files and directories + * within a given path. + */ +class sub_dir implements spl_sequence +{ + protected $adir = array(); + protected $cnt = 0; + protected $path = ""; + protected $curr = ""; + protected $nodots = true; + + /** + * Construct a directory from a path. + * + * @param path The path to iterate. + * @param nodots Whether or not to display the entries '.' and '..'. + */ + function __construct($path, $nodots = true) { + $this->cnt = 0; + $this->path = $path; + } + + /** + * Rewind the directory. + * + * @return void + */ + function rewind() { + while($this->cnt) { + unset($this->adir[$this->cnt--]); + } + $dir = new spl_dir($this->path); + $dir->path = ""; + $this->adir[1] = $dir; + $this->cnt = 1; + if ($this->nodots) { + while ($this->has_more()) { + $ent = $this->current(); + if ($ent != '.' && $ent != '..') { + break; + } + $this->next(); + } + } + } + + /** + * Move to net dir or file entry. + * + * @return void + */ + function next() { + if ($this->cnt) { + $dir = $this->adir[$this->cnt]; + $ent = $dir->current(); + $path = $dir->get_path().'/'.$ent; + if ($ent != '.' && $ent != '..' && is_dir($path)) { + $new = new spl_dir($path); + $new->path = $dir->path.$ent.'/'; + $new->cnt = $this->cnt++; + $this->adir[$this->cnt] = $new; + if ($this->nodots) { + while ($new->has_more()) { + $ent = $new->current(); + if ($ent != '.' && $ent != '..') { + break; + } + $new->next(); + } + } + } + $dir->next(); + } + } + + /** + * @return Whether more dirs or files entries are available. + */ + function has_more() { + while ($this->cnt) { + $dir = $this->adir[$this->cnt]; + if ($dir->has_more()) { + return true; + } + unset($this->adir[$this->cnt--]); + } + return false; + } + + /** + * @return The current dir or file entry. + */ + function current() { + if ($this->cnt) { + $dir = $this->adir[$this->cnt]; + return $dir->path . $dir->current(); + } + throw new exception("No more elements available"); + } + + /** + * Hidden __clone + */ + protected function __clone() { + // disallow clone + } +} + +?>
\ No newline at end of file |