簡體   English   中英

使用PHP創建目錄和子目錄中所有文件的嵌套數組的代碼不起作用

[英]Code to create a nested array of all files in a directory & subdirectories with PHP is not working

我正在嘗試在PHP手冊網站上使用示例函數(由用戶發布)。 該函數應該返回服務器指定目錄中所有文件和/或文件夾的嵌套數組。

我只是在學習php,所以我認為我更有可能做錯了,而且這個功能不太可能。 但如果有比下面的功能更簡單的方法,請告訴我。

我能夠迭代並回顯基本路徑中的所有文件,但不能回顯示例子文件夾中的文件。 子文件夾應該是的索引是空白或只是文件夾名稱而不是數組,具體取決於我使用的參數。 當我能夠獲取文件夾名稱時,我使用返回false的is_array對其進行了測試。

這是功能:

list_array:返回一個數組,其中包含可選的所有文件,僅包含文件系統路徑中的目錄或文件

  • @param $ base_path字符串絕對路徑或相對路徑

  • @param $ filter_dir boolean從結果中篩選目錄(如果$ recursive為true,則忽略在最后一個目錄中)

  • @param $ filter_files boolean從結果中篩選文件

  • @param $ exclude string管道分隔的文件字符串,始終忽略

  • @param $ recursive boolean底層的Descend目錄?

  • @return $ result_list數組嵌套數組或false

     function directory_list($directory_base_path, $filter_dir = false, $filter_files = false, $exclude = ".|..|.DS_Store|.svn", $recursive = true){ $directory_base_path = rtrim($directory_base_path, "/") . "/"; if (!is_dir($directory_base_path)){ error_log(__FUNCTION__ . "File at: $directory_base_path is not a directory."); return false; } $result_list = array(); $exclude_array = explode("|", $exclude); if (!$folder_handle = opendir($directory_base_path)) { error_log(__FUNCTION__ . "Could not open directory at: $directory_base_path"); return false; }else{ while(false !== ($filename = readdir($folder_handle))) { if(!in_array($filename, $exclude_array)) { if(is_dir($directory_base_path . $filename . "/")) { if($recursive && strcmp($filename, ".")!=0 && strcmp($filename, "..")!=0 ){ // prevent infinite recursion error_log($directory_base_path . $filename . "/"); $result_list[$filename] = directory_list("$directory_base_path$filename/", $filter_dir, $filter_files, $exclude, $recursive); }elseif(!$filter_dir){ $result_list[] = $filename; } }elseif(!$filter_files){ $result_list[] = $filename; } } } closedir($folder_handle); return $result_list; } 

    }

這是我嘗試過的很多事情之一。 該數組包含5個元素,但只顯示其中的4個。 回應$ array [4]是空白的。 我只是想在這一點上獲得嵌套數組。 但是,如果有更簡單的方法來迭代它,任何提示都非常感激。

$directory_base_path = "../sandbox/";
$filter_dir = false;
$filter_files = false;
$exclude_files = ".|..|.DS_Store|dir_read_test.php";
$recursive = true;
$array = directory_list($directory_base_path, $filter_dir, $filter_files, $exclude_files, $recursive);
$array_length = count($array);
echo $array_length;
echo "<br/>";
$count = 0;

while ( $array_length >= $count ) {
 echo $array[$count];
 echo "<br/>";
 $count = $count + 1;
}

仔細看看那個例程:

    $result_list[$filename] = directory_list(/*recursive*/);
 else
    $result_list[] = $filename;

有什么不同? 遞歸條目放在索引$filename ,而直接內容放在升序整數索引下,使用[] 你的循環只會顯示整數索引。

如果你能

print_r($array);

你會看到所有的條目。 (或者你可以替換[$filename][]當然。)要通過他們自己的循環,更換while循環

foreach ( $array as $k=>$v )
{
    echo "$k: $v<br/>";
}

(對於subdir,這將顯示“subdir:Array”,但這是另一個主題;您可以測試is_array($v)並根據它執行一些操作)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM