繁体   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