function inorder($t) { $stack = new SplStack(); $result = array(); $p = $t; while ($stack->valid() || $p) { if ($p) { $stack->push($p); $stack->rewind(); $p = $p->left; } else { $t = $stack->pop(); $result[] = $t->key; $stack->rewind(); $p = $t->right; } } return $result; }
function postorder($tree) { $lst = array(); if (!$tree) { return $lst; } $stack = new SplStack(); $stack->push($tree); $stack->rewind(); $prev = null; while ($stack->valid()) { $curr = $stack->current(); // go down the tree. //check if current node is leaf, if so, process it and pop stack, //otherwise, keep going down if (!$prev || @$prev->left->key == @$curr->key || @$prev->right->key == @$curr->key) { //prev == null is the situation for the root node if ($curr->left) { $stack->push($curr->left); $stack->rewind(); } else { if ($curr->right) { $stack->push($curr->right); $stack->rewind(); } else { $stack->pop(); $stack->rewind(); $lst[] = $curr->key; } } //go up the tree from left node //need to check if there is a right child //if yes, push it to stack //otherwise, process parent and pop stack } else { if (@$curr->left->key == @$prev->key) { if (@$curr->right->key) { $stack->push($curr->right); $stack->rewind(); } else { $stack->pop(); $stack->rewind(); $lst[] = $curr->key; } } else { if (@$curr->right->key == @$prev->key) { $stack->pop(); $stack->rewind(); $lst[] = $curr->key; } } } $prev = $curr; } return $lst; }
/** * Logs with an arbitrary level. * * @param string $level * @param string|array $message a textual message, encoded JSON or array to encode into JSON * @param array $context context regarding the message, if this is included it will * added to the message as json or included in the json payload * @throws \InvalidArgumentException * @return null */ public function log($level, $message, array $context = array()) { $this->connectIfNotConnected(); if (is_array($message)) { $message = json_encode($message); } if (!is_string($message)) { throw new \InvalidArgumentException('the message argument needs to be a string or an array'); } else { $isJson = $this->isJSON($message); if ($isJson) { $json = json_decode($message, true); if ("" != $this->_hostname) { $json["hostname"] = $this->_hostname; } $json["level"] = $level; if (count($context) > 0) { $json["context"] = $context; } $message = json_encode($json); } else { $message = strtoupper($level) . " - " . $message; if ("" != $this->_hostname) { $message = "hostname={$this->_hostname} - " . $message; if (count($context) > 0) { $message .= " - " . json_encode($context); } } } $this->_writer_stack->rewind(); while ($this->_writer_stack->valid()) { /** @var LogEntriesWriter $writer */ $writer = $this->_writer_stack->current(); $message = $writer->log($message, $isJson); $this->_writer_stack->next(); } $this->writeToSocket($this->substituteNewline($message) . PHP_EOL); } }
/** * 匹配最小子科室未匹配到科室信息的情况 * @author gaoqing * 2015年11月2日 * @param SplStack $notMatchDepartmentStack 未匹配的子科室栈 * @param array $matchArr 已匹配的父科室数组 * @return int 更新后的最小子科室id */ private function dealWithChildDepartmentNotMatch($notMatchDepartmentStack, $matchArr) { $currentDepartmentID = 0; //都未匹配时: $pid = 0; //部分匹配时: if (!empty($matchArr)) { $pid = isset($matchArr[0]) ? isset($matchArr[0][0]) ? $matchArr[0][0]['id'] : 0 : 0; } $notMatchDepartmentStack->rewind(); while ($notMatchDepartmentStack->valid()) { if ($notMatchDepartmentStack->isEmpty()) { break; } $departmentAndLevel = $notMatchDepartmentStack->pop(); //向 wd_keshi_test 表中,插入科室信息 $currentDepartmentID = $pid = $this->insertKeshiInfo($departmentAndLevel, $pid); } return $currentDepartmentID; }