1

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

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

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

这是功能:

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

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

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

  • @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;
}
4

1 回答 1

4

仔细看看这个例程:

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

有什么不同?递归条目放在 index 下$filename,而直接内容放在升序整数索引下,使用[]. 您的循环将仅显示整数索引。

如果你愿意

print_r($array);

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

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

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

于 2010-08-11T21:25:29.680 回答