protected function traverseArray(array $nodes)
{
$doNodes = array();
foreach ($nodes as $i => &$node) {
if (is_array($node)) {
$node = $this->traverseArray($node);
} elseif ($node instanceof Node) {
$traverseChildren = true;
foreach ($this->visitors as $visitor) {
$return = $visitor->enterNode($node);
if (self::DONT_TRAVERSE_CHILDREN === $return) {
$traverseChildren = false;
} else {
if (null !== $return) {
$node = $return;
}
}
}
if ($traverseChildren) {
$node = $this->traverseNode($node);
}
foreach ($this->visitors as $visitor) {
$return = $visitor->leaveNode($node);
if (self::REMOVE_NODE === $return) {
$doNodes[] = array($i, array());
break;
} elseif (is_array($return)) {
$doNodes[] = array($i, $return);
break;
} elseif (null !== $return) {
$node = $return;
}
}
}
}
if (!empty($doNodes)) {
while (list($i, $replace) = array_pop($doNodes)) {
array_splice($nodes, $i, 1, $replace);
}
}
return $nodes;
}