Para el tema de subcarpetas, existe la funcion is_dir() (
www.php.net/is_dir). Segun vas recorriendo un directorio, almacenas en un array los subdirectorios. Cuando acabas con ese directorio, comienzas con sus subdirectorios. Acuerdate de meter en el array la ruta completa del subdirectorio.
Saludos.