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