protected function traverse($node, &$toTraverse, &$props, $root) {
    foreach ($toTraverse as $i => $elem)  {
      if ($elem->isSameNode($node)){
        unset($toTraverse[$i]);
      }
    }
    if (!$root->isSameNode($node)) {
      $names = $node->itemProp();
      if (count($names)) {
        //@todo Add support for property name filtering.
        $props[] = $node;
      }
      if ($node->itemScope()) {
        return;
      }
    }
    if (isset($node)) {
      // An xpath expression is used to get children instead of childNodes
      // because childNodes contains DOMText children as well, which breaks on
      // the call to getAttributes() in itemProp().
      $children = $this->ownerDocument->xpath()->query($node->getNodePath() . '/*');
      foreach ($children as $child) {
        $this->traverse($child, $toTraverse, $props, $root);
      }
    }
  }
protected function traverse($node, &$toTraverse, &$props, $root) {
    foreach ($toTraverse as $i => $elem)  {
      if ($elem->isSameNode($node)){
        unset($toTraverse[$i]);
      }
    }
    if (!$root->isSameNode($node)) {
      $names = $node->itemProp();
      if (count($names)) {
        //@todo Add support for property name filtering.
        $props[] = $node;
      }
      if ($node->itemScope()) {
        return;
      }
    }
    if (isset($node)) {
      // An xpath expression is used to get children instead of childNodes
      // because childNodes contains DOMText children as well, which breaks on
      // the call to getAttributes() in itemProp().
      $children = $this->ownerDocument->xpath()->query($node->getNodePath() . '/*');
      foreach ($children as $child) {
        $this->traverse($child, $toTraverse, $props, $root);
      }
    }
  }
protected function traverse ( $ node , & $ toTraverse , & $ props , $ root ) { foreach ( $ toTraverse as $ i => $ elem ) { if ( $ elem -> isSameNode ( $ node ) ) { unset ( $ toTraverse [ $ i ] ) ; } } if ( ! $ root -> isSameNode ( $ node ) ) { $ names = $ node -> itemProp ( ) ; if ( count ( $ names ) ) { //@todo Add support for property name filtering. $ props [ ] = $ node ; } if ( $ node -> itemScope ( ) ) { return ; } } if ( isset ( $ node ) ) { // An xpath expression is used to get children instead of childNodes // because childNodes contains DOMText children as well, which breaks on // the call to getAttributes() in itemProp(). $ children = $ this -> ownerDocument -> xpath ( ) -> query ( $ node -> getNodePath ( ) . '/*' ) ; foreach ( $ children as $ child ) { $ this -> traverse ( $ child , $ toTraverse , $ props , $ root ) ; } } }
Traverse the tree.

In MicrodataJS, this is handled using a closure.
See comment for MicrodataPhp:getObject() for an explanation of closure use
in this library.
Traverse the tree .