Lo que necesitas hacer Only es algo llamado recursividad; pero ¿qué es la recursividad?, a términos generales es una función que se llama a sí misma para resolverse, es decir, mientras algo se cumpla se seguirá ejecutando.
Teniendo en cuenta ésto, y qué es más sencillo y gasta menos memoria la función scandir() la cual es más completa llegamos al siguiente resultado:
<?php
function scanDirectory($directory){
$files = scandir($directory);
echo '<ul>';
foreach($files as $file){
if($file != '.' && $file != '..'){
if(filetype($directory . $file) == 'dir'){
echo '<li>Directorio :: ' . $directory . $file . '/';
scanDirectory($directory . $file . '/');
}else{
echo '<li>' . $file;
}
echo '</li>';
}
}
echo '</ul>';
}
scanDirectory('./');
?>
Ahora, sino quieres emplear tablas para que el listado sea más estético puedes usar éste otro:
<?php
function scanDirectory($directory){
$files = scandir($directory);
foreach($files as $file){
if($file != '.' && $file != '..'){
if(filetype($directory . $file) == 'dir'){
echo '<h1>' . $directory . $file . '/</h1>';
scanDirectory($directory . $file . '/');
}else{
echo $file . '<br />';
}
}
}
}
scanDirectory('./');
?>
¿Qué hace la función?, escanea un directorio en busca de archivos y directorios; al encontrar un directorio vuelve a llamar la función en sí recursivamente para escanear así hasta no encontrar nada.
Saludos,
Xt3mP.