Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的文件夹树_Php_Readdir_Opendir - Fatal编程技术网

php中的文件夹树

php中的文件夹树,php,readdir,opendir,Php,Readdir,Opendir,我想用php列出一个文件夹的内容 但是我只想显示文件夹,而不是文件 此外,我想显示最多一个子文件夹 你能帮帮我吗 我的代码: <?php function mkmap($dir){ echo "<ul>"; $folder = opendir ($dir); while ($file = readdir ($folder)) { if ($file != "." && $file != "..") {

我想用php列出一个文件夹的内容

但是我只想显示文件夹,而不是文件

此外,我想显示最多一个子文件夹

你能帮帮我吗

我的代码:

<?php
function mkmap($dir){
    echo "<ul>";   
    $folder = opendir ($dir);

    while ($file = readdir ($folder)) {   
        if ($file != "." && $file != "..") {           
            $pathfile = $dir.'/'.$file;           
            echo "<li><a href=$pathfile>$file</a></li>";           
            if(filetype($pathfile) == 'dir'){               
                mkmap($pathfile);               
            }           
        }       
    }
    closedir ($folder);    
    echo "</ul>";   
}
?>

<?php mkmap('.'); ?>

要检查文件是否为文件夹,请使用
is_dir()
函数

此递归解决方案将列出文件夹和子文件夹:

 <?php

function mkmap($dir){
    $ffs = scandir($dir);
    echo '<ul>';
    foreach($ffs as $file){
        if($file != '.' && $file!= '..' ){

            $path=$dir.'/'.$file;
             echo "<li><a href='".$path."'>$file</a></li>";           

            if(is_dir($dir.'/'.$file)) mkmap($dir.'/'.$file);

        }
    }
    echo '</ul>';
}

mkmap('main dir');
?>

要检查文件是否为文件夹,请使用
is_dir()
函数

此递归解决方案将列出文件夹和子文件夹:

 <?php

function mkmap($dir){
    $ffs = scandir($dir);
    echo '<ul>';
    foreach($ffs as $file){
        if($file != '.' && $file!= '..' ){

            $path=$dir.'/'.$file;
             echo "<li><a href='".$path."'>$file</a></li>";           

            if(is_dir($dir.'/'.$file)) mkmap($dir.'/'.$file);

        }
    }
    echo '</ul>';
}

mkmap('main dir');
?>

将最大递归级别传递给函数。通过这种方式,您可以在运行时决定要深入多少层

此外,最好(我认为)在外部完成“我想要dirs或者不想要dirs”的决策,并将其作为参数传递。这样一来,一个函数可以同时完成这两个任务

最后,让函数输出HTML很少是个好主意。最好将其作为字符串返回,这样您就可以更自由地移动代码。理想情况下,您希望将所有逻辑与表示视图分离(除此之外,还有谷歌的“MVC”)

更好的做法是将HTML模板传递给
mkmap
函数,并让它使用该模板创建HTML片段。这样,如果在一个地方你想要一个
,在另一个地方你想要一个
,你不需要使用同一功能的两个版本;但这可能有些过分(如果您需要的话,您可以使用
str\u replace
或XML函数轻松实现)

函数mkmap($dir,$depth=1,$only_dirs=True){
$response='
    '; $folder=opendir($dir); 而($file=readdir($folder)){ 如果($file!='.&&$file!='..'){ $pathfile=$dir.'/'.$file; if($only_dirs&&!is_dir($pathfile)) 继续; $response.=“
  • ”; if(is_dir($pathfile)&($depth!==0)) $response.=mkmap($file,$depth-1,$only_dirs); } } closedir($文件夹); $response.='
'; 返回$response; } //到达深度5 echo mkmap('Main Dir',5,True); //深度不同于零的显式检查意味着 //如果你从深度-1开始,它将表现为“无限深度”, //这在某些用例中可能是可取的。
模板 有许多方法可以对函数进行模板化,但最简单的方法可能是这样(对于更复杂的定制,XML是必需的—使用字符串函数管理HTML有以下几种方法):

函数mkmap($dir,$depth=1,$only_dirs=True),
$template=False){
if(False==$template){
$template=array(“
    ”、“
  • ”、“
”); } $response=''; $folder=opendir($dir); 而($file=readdir($folder)){ 如果($file!='.&&$file!='..'){ $pathfile=$dir.'/'.$file; if($only_dirs&&!is_dir($pathfile)) 继续; $response.=str_replace(数组('{path}','{file}'),数组($pathfile,$file),$template[1]); if(is_dir($pathfile)&($depth!==0)) $response.=mkmap($file,$depth-1,$only_dirs,$template); } } closedir($文件夹); 返回$template[0]。$response.$template[2]; }
该函数的工作方式与之前类似,但您可以传递另一个参数来对其进行自定义:

echo mkmap('Main Dir', 5, True, array(
    '<ul class="filetree">',
    '<li><a href="{path}"><img src="file.png" /><tt>{file}</tt></a></li>',
    '</ul>'));
echo mkmap('Main Dir',5,True,数组( “
    ”, “
  • ”, “
”);
将最大递归级别传递给函数。通过这种方式,您可以在运行时决定要深入多少层

此外,最好(我认为)在外部完成“我想要dirs或者不想要dirs”的决策,并将其作为参数传递。这样一来,一个函数可以同时完成这两个任务

最后,让函数输出HTML很少是个好主意。最好将其作为字符串返回,这样您就可以更自由地移动代码。理想情况下,您希望将所有逻辑与表示视图分离(除此之外,还有谷歌的“MVC”)

更好的做法是将HTML模板传递给
mkmap
函数,并让它使用该模板创建HTML片段。这样,如果在一个地方你想要一个
,在另一个地方你想要一个
,你不需要使用同一功能的两个版本;但这可能有些过分(如果您需要的话,您可以使用
str\u replace
或XML函数轻松实现)

函数mkmap($dir,$depth=1,$only_dirs=True){
$response='
    '; $folder=opendir($dir); 而($file=readdir($folder)){ 如果($file!='.&&$file!='..'){ $pathfile=$dir.'/'.$file; if($only_dirs&&!is_dir($pathfile)) 继续; $response.=“
  • ”; if(is_dir($pathfile)&($depth!==0)) $response.=mkmap($file,$depth-1,$only_dirs); } } closedir($文件夹); $response.='
'; 返回$response; } //到达深度5 echo mkmap('Main Dir',5,True); //深度不同于零的显式检查意味着 //如果你从深度-1开始,它将表现为“无限深度”, //这在某些用例中可能是可取的。
模板 有许多方法可以对函数进行模板化,但最简单的方法可能是这样(对于更复杂的定制,XML是必需的—使用字符串函数管理HTML有以下几种方法):

函数mkmap($dir,$depth=1,$only_dirs=True),
$template=False){
if(False==$template){
$template=array(“
    ”、“
  • ”、“
”); } $response=''; $folder=opendir($dir); 而($file=readdir($folder)){ 如果($file!='.&&$file!='..'){ $pathfile=$dir.'/'.$file;
echo mkmap('Main Dir', 5, True, array(
    '<ul class="filetree">',
    '<li><a href="{path}"><img src="file.png" /><tt>{file}</tt></a></li>',
    '</ul>'));