function printTree(int $level = 1) : void {
// открываем дескриптор текущей директории
$dir = opendir('.');
// завершаем работу функции, если не удалось открыть дескриптор
if (!$dir) return;
// перебираем элементы директории по её дескриптору
while (($file = readdir($dir)) !== false) {
// если это ссылка на текущую директорию или родительскую - игнорируем этот элемент
if ($file == '.' || $file == '..') continue;
// если это не директория - игнорируем этот элемент
if (!is_dir($file)) continue;
// выводим "отступ" от левого края
for ($i = 0; $i < $level; $i++) echo ' ';
// выводим название директории
echo $file . PHP_EOL;
// пытаемся изменить текущую директорию на дочернюю директорию $file
// если не удалось - пропускаем директорию $file
if (!chdir($file)) continue;
// рекурсивно вызываем эту же функцию, чтобы она
// отобразила "дерево" каталогов, но уже для дочерней директории $file
printTree($level + 1);
// изменяем текущую директорию на изначальную
chdir('..');
// непонятно зачем, но пытаемся сбросить буфер вывода
flush();
}
// закрываем дескриптор
closedir($dir);
}