【问题标题】:Code to create a nested array of all files in a directory & subdirectories with PHP is not working使用 PHP 在目录和子目录中创建所有文件的嵌套数组的代码不起作用
【发布时间】:2011-03-28 15:13:08
【问题描述】:

我正在尝试使用 PHP 手册网站上的示例函数(由用户发布)。该函数应该返回服务器指定目录中所有文件和/或文件夹的嵌套数组。

我只是在学习php,所以我认为我做错了什么的可能性更大,而功能不起作用的可能性较小。但如果有比下面的函数更简单的方法,请告诉我。

我能够遍历并回显基本路径中的所有文件,但不能遍历示例子文件夹中的文件。子文件夹的索引应该是空白或只是文件夹名称而不是数组,具体取决于我使用的参数。当我能够获得文件夹名称时,我使用 is_array 对其进行了测试,结果返回 false。

函数如下:

list_array:返回一个数组,可选地包含所有文件、仅目录或仅文件系统路径中的文件

  • @param $base_path string 绝对或相对路径

  • @param $filter_dir boolean 从结果中过滤目录(如果 $recursive 为 true,则忽略最后一个目录)

  • @param $filter_files boolean 从结果中过滤文件

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

  • @param $recursive boolean 将目录降级到底部?

  • @return $result_list array 嵌套数组或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;
}

【问题讨论】:

    标签: php file recursion directory opendir


    【解决方案1】:

    仔细看看这个例程:

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

    有什么区别?递归条目放在索引$filename 下,而直接内容放在升序整数索引下,使用[]。您的循环只会显示 integer 索引。

    如果你愿意

    print_r($array);
    

    您将看到所有条目。 (当然,您也可以将 [$filename] 替换为 []。)要自己循环它们,请将 while 循环替换为

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

    (对于子目录,这将显示“子目录:数组”,但这是另一个主题;您可以测试is_array($v) 并基于此采取一些行动)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      相关资源
      最近更新 更多