2016-12-04 50 views
1

我试图创建一个函数来扫描目录中的所有文件以及该目录下的目录(以后再进一步讨论)。目前它看到主(指定)目录中的所有文件,但在指定目录下的目录中,代码不会看到所有文件。扫描功能不起作用


这是我的函数:

<?php 
function scanfiles($arg1){ 
    // Set variables 
    $files = array(); 

    // Analyze the main dir 
    $main_files = array_filter(scandir($arg1), function($files_arg1){ return is_file($files_arg1); }); 
    $main_folders = array_filter(scandir($arg1), function($folders_arg1){ return is_dir($folders_arg1); }); 

    // Remove dots from main_folders 
    $main_folders = array_diff($main_folders, array('..', '.')); 

    // Add all files from main_files to the files array 
    foreach($main_files as $main_key => $main_value){ 
     $files[] = "/" . $main_value; 
    } 

    // Check subfolders 
    foreach($main_folders as $sub1_key => $sub1_value){ 
     // Analyze subfolder 
     $sub1_files = array_filter(scandir($arg1 . "/" . $sub1_value), function($files_arg1){ return is_file($files_arg1); }); 
     $sub1_folders = array_filter(scandir($arg1 . "/" . $sub1_value), function($folders_arg1){ return is_dir($folders_arg1); }); 

     // Add all files from sub1_files to files array 
     foreach($sub1_files as $sub1_add_key => $sub1_add_value){ 
      $files[] = "/" . $sub1_value . "/" . $sub1_add_value; 
     } 
    } 
    return $files; 
} 

foreach (scanfiles(__DIR__) as $key => $value) { 
    echo "<br>" . $value; 
} 
?> 



这是输出我得到:

/.DS_Store 
/.htaccess 
/action.php 
/index.php 
/admin/.DS_Store 
/includes/.DS_Store 
/includes/.htaccess 
/install/index.php 



我真的不明白怎么回事错误导致本应是输出:

/.DS_Store 
/.htaccess 
/action.php 
/index.php 
/admin/.DS_Store 
/admin/index.php 
/admin/login.php 
/includes/.DS_Store 
/includes/.htaccess 
/includes/config.inc.php 
/install/index.php 



任何知道最新问题的人,可以帮助我吗?

所有的帮助将不胜感激!


-Jamie

回答

1

编辑与corrent answare 其原因是array_filter功能 你不要,如果你改变这样

$sub1_files = array_filter(scandir($arg1 . "/" . $sub1_value.'/'), function($files_arg1){ 
     echo $files_arg1; 
     return is_file($files_arg1); }); 

,你会发现什么即时通讯代码发送正确的路径给它 说你可以通过你自己处理它或发送路径到array_filter太

+0

嗯....没有如果你读,你看到的是被插入阵列中的注释,其最终会是这个结果。就像没有斜杠一样'/ index.php'就是结果中的'index.php'。 – Jamie42

+0

我已经改变了我的答案,你可以检查它 –

+0

好吧现在测试它 – Jamie42

1

所以,我现在发现我使用的问题$ folders_arg1变量在子文件夹的scandir中,没有定义它应该检查子文件夹中的is_file。因为它会搜索文件本身的文件夹。

固定码:

<?php 
function scanfiles($arg1){ 
    global $sub1_value; 

    // Define arg1 as a constant 
    define("arg1", $arg1); 

    // Set variables 
    $files = array(); 

    // Analyze the main dir 
    $main_files = array_filter(scandir($arg1), function($files_arg1){ return is_file(arg1 . "/" . $files_arg1); }); 
    $main_folders = array_filter(scandir($arg1), function($folders_arg1){ return is_dir(arg1 . "/" . $folders_arg1); }); 

    // Remove dots from main_folders 
    $main_folders = array_diff($main_folders, array('..', '.')); 

    // Add all files from main_files to the files array 
    foreach($main_files as $main_key => $main_value){ 
     $files[] = "/" . $main_value; 
    } 

    // Check subfolders 
    foreach($main_folders as $sub1_key => $sub1_value){ 
     // Analyze subfolder 
     $sub1_files = array_filter(scandir($arg1 . "/" . $sub1_value), function($files_arg1){ return is_file(arg1 . "/" . $GLOBALS['sub1_value'] . "/" . $files_arg1); }); 
     $sub1_folders = array_filter(scandir($arg1 . "/" . $sub1_value), function($folders_arg1){ return is_dir(arg1 . "/" . $GLOBALS['sub1_value'] . "/" . $folders_arg1); }); 

     // Add all files from sub1_files to files array 
     foreach($sub1_files as $sub1_add_key => $sub1_add_value){ 
      $files[] = "/" . $sub1_value . "/" . $sub1_add_value; 
     } 
    } 
    return $files; 
} 
foreach (scanfiles(__DIR__) as $key => $value) { 
    echo "<br>" . $value; 
} 
?>