firstChild ) { $node = $node->firstChild; } while ( true ) { $visitFunc( $node ); if ( $node === $root ) { return; // Visiting the root is the last thing we do. } /* Look for right sibling to continue traversal. */ if ( $node->nextSibling ) { $node = $node->nextSibling; /* Loop back and visit its leftmost (grand)child first. */ break; } /* Visit parent only after we've run out of right siblings. */ $node = $node->parentNode; } } } }