Queste sono due funzioni che avevo postato per un problema simile:
Codice PHP:
function read_dir_tree($folder) {
    
$output = array();
    foreach ( 
scandir($folder) as $item ) {
        if ( 
$item == '.' OR $item == '..' )
            continue;
        
$full_path "$folder/$item";
        if ( 
is_dir($full_path) ) {
            
$output[$item] = read_dir_tree($full_path);
        } else {
            
$output[] = $full_path;
        }
    }
    return 
$output;
}

function 
read_dir_plain($folder) {
    
$output = array();
    foreach ( 
scandir($folder) as $item ) {
        if ( 
$item == '.' OR $item == '..' )
            continue;
        
$full_path "$folder/$item";
        if ( 
is_dir($full_path) ) {
            
$output array_merge($outputread_dir_plain($full_path));
        } else {
            
$output[] = $full_path;
        }
    }
    return 
$output;
}

print_r(read_dir_tree('/percorso/della/directory')); 
La prima restituisce un array a n dimensioni che rispecchia la struttura delle directory, la seconda invece fornisce solo una lista "piatta" di tutti i file con il loro path.