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); } }
/** * @return ResourceInterface */ public function current() { $resource = parent::current(); return $resource ? $this->transform($resource) : $resource; }