118 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php namespace Sieve;
 | |
| 
 | |
| class SieveTree
 | |
| {
 | |
|     protected $childs_;
 | |
|     protected $parents_;
 | |
|     protected $nodes_;
 | |
|     protected $max_id_;
 | |
|     protected $dump_;
 | |
| 
 | |
|     public function __construct($name = 'tree')
 | |
|     {
 | |
|         $this->childs_ = array();
 | |
|         $this->parents_ = array();
 | |
|         $this->nodes_ = array();
 | |
|         $this->max_id_ = 0;
 | |
| 
 | |
|         $this->parents_[0] = null;
 | |
|         $this->nodes_[0] = $name;
 | |
|     }
 | |
| 
 | |
|     public function addChild(SieveDumpable $child)
 | |
|     {
 | |
|         return $this->addChildTo($this->max_id_, $child);
 | |
|     }
 | |
| 
 | |
|     public function addChildTo($parent_id, SieveDumpable $child)
 | |
|     {
 | |
|         if (!is_int($parent_id)
 | |
|          || !isset($this->nodes_[$parent_id]))
 | |
|             return null;
 | |
| 
 | |
|         if (!isset($this->childs_[$parent_id]))
 | |
|             $this->childs_[$parent_id] = array();
 | |
| 
 | |
|         $child_id = ++$this->max_id_;
 | |
|         $this->nodes_[$child_id] = $child;
 | |
|         $this->parents_[$child_id] = $parent_id;
 | |
|         array_push($this->childs_[$parent_id], $child_id);
 | |
| 
 | |
|         return $child_id;
 | |
|     }
 | |
| 
 | |
|     public function getRoot()
 | |
|     {
 | |
|         return 0;
 | |
|     }
 | |
| 
 | |
|     public function getChilds($node_id)
 | |
|     {
 | |
|         if (!is_int($node_id)
 | |
|         || !isset($this->nodes_[$node_id]))
 | |
|             return null;
 | |
| 
 | |
|         if (!isset($this->childs_[$node_id]))
 | |
|             return array();
 | |
| 
 | |
|         return $this->childs_[$node_id];
 | |
|     }
 | |
| 
 | |
|     public function getNode($node_id)
 | |
|     {
 | |
|         if ($node_id == 0 || !is_int($node_id)
 | |
|          || !isset($this->nodes_[$node_id]))
 | |
|             return null;
 | |
| 
 | |
|         return $this->nodes_[$node_id];
 | |
|     }
 | |
| 
 | |
|     public function dump()
 | |
|     {
 | |
|         $this->dump_ = $this->nodes_[$this->getRoot()] ."\n";
 | |
|         $this->dumpChilds_($this->getRoot(), ' ');
 | |
|         return $this->dump_;
 | |
|     }
 | |
| 
 | |
|     protected function dumpChilds_($parent_id, $prefix)
 | |
|     {
 | |
|         if (!isset($this->childs_[$parent_id]))
 | |
|             return;
 | |
| 
 | |
|         $childs = $this->childs_[$parent_id];
 | |
|         $last_child = count($childs);
 | |
| 
 | |
|         for ($i=1; $i <= $last_child; ++$i)
 | |
|         {
 | |
|             $child_node = $this->nodes_[$childs[$i-1]];
 | |
|             $infix = ($i == $last_child ? '`--- ' : '|--- ');
 | |
|             $this->dump_ .= $prefix . $infix . $child_node->dump() . " (id:" . $childs[$i-1] . ")\n";
 | |
| 
 | |
|             $next_prefix = $prefix . ($i == $last_child ? '   ' : '|  ');
 | |
|             $this->dumpChilds_($childs[$i-1], $next_prefix);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function getText()
 | |
|     {
 | |
|         $this->dump_ = '';
 | |
|         $this->childText_($this->getRoot());
 | |
|         return $this->dump_;
 | |
|     }
 | |
| 
 | |
|     protected function childText_($parent_id)
 | |
|     {
 | |
|         if (!isset($this->childs_[$parent_id]))
 | |
|             return;
 | |
| 
 | |
|         $childs = $this->childs_[$parent_id];
 | |
| 
 | |
|         for ($i = 0; $i < count($childs); ++$i)
 | |
|         {
 | |
|             $child_node = $this->nodes_[$childs[$i]];
 | |
|             $this->dump_ .= $child_node->text();
 | |
|             $this->childText_($childs[$i]);
 | |
|         }
 | |
|     }
 | |
| }
 | 
