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