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]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |