2016-12-04 89 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; 
} 
?>