# Traversal

HTML: [altophp.com/tree/traversal](https://altophp.com/tree/traversal/)

Use the built-in collector when you need file and directory paths or counts.

```php
use Alto\Tree\Traverser\TreeTraverser;
use Alto\Tree\Visitor\CollectorVisitor;

$collector = new CollectorVisitor();
$traverser = new TreeTraverser();
$traverser->addVisitor($collector);
$traverser->traverse($tree);

$files = $collector->getFiles();
$directories = $collector->getDirectories();
echo $collector->getSummary();
```

Traversal is depth-first and follows child insertion order. The collector
counts a directory when the traverser enters it; an empty directory is visited
as a node but is not entered.

## Add custom behavior

```php
use Alto\Tree\TreeNode;
use Alto\Tree\Visitor\VisitorInterface;

$visitor = new class implements VisitorInterface {
    public array $phpFiles = [];

    public function visitNode(TreeNode $node, int $depth): void
    {
        if (!$node->isDir && str_ends_with($node->name, '.php')) {
            $this->phpFiles[] = $node->path;
        }
    }

    public function enterDirectory(TreeNode $node, int $depth): void {}

    public function leaveDirectory(TreeNode $node, int $depth): void {}
};

$traverser->addVisitor($visitor);
$traverser->traverse($tree);
```

Several visitors may be registered on one traverser. Each receives
`visitNode()`, then directory enter and leave callbacks where applicable.

---

Previous: [Printing](https://altophp.com/tree/printing.md)
Next: [Editing](https://altophp.com/tree/editing.md)

---

ALTO\TREE: [altophp.com/tree](https://altophp.com/tree/)
ALTO(PHP): [altophp.com](https://altophp.com/)
