Traversing trees

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.