使用PHP列出所有子目录和文件

时间:2014-07-22 05:34:54

标签: php arrays list

我正在尝试构建一个函数,该函数将回显URL中所有子目录和文件的无序列表。

我知道这里有很多例子,但我很难找到合适的东西。

这是我到目前为止所做的:

$dir = "an/example/directory";

echo "<ul id='folderList'>";
$dirArr = dirToArray($dir);
listDir($dirArr);
echo "</ul>";

第一个函数以递归方式搜索文件和文件夹,并将它们分类为多维数组:

function dirToArray($dir)
{
    $result = array();
    $cdir = scandir($dir);
    foreach($cdir as $key => $value) {
        if (!in_array($value, array(".", ".."))) {
            if(is_dir($dir . DIRECTORY_SEPARATOR . $value)) {
                $result[$dir . DIRECTORY_SEPARATOR . $value] = $this->dirToArray($dir . DIRECTORY_SEPARATOR . $value);
            } else {
                $result[$dir . DIRECTORY_SEPARATOR . $value] = $dir . DIRECTORY_SEPARATOR . $value;
            }
          }
    }

    return $result;
}

现在这是我遇到麻烦的部分。第二个函数应循环遍历多数组并相应地回显其内容。

function listDir($multiArr) 
{
    foreach ($multiArr as $key => $value) {
        if (is_array($value)) {
            echo '<li class="sub-directory"><span>'.basename($key).'</span>';
            echo '<ul>';
            listDir($multiArr[$key]);
            echo '</ul>';
        } else {
            echo '<li class="file"><span>'.basename($value).'</span>';
        }
          echo '</li>';
    }
}

然而,第二个功能似乎没有按预期工作。我不确定为什么,但似乎在递归循环中遇到了麻烦。

无论如何,这个想法是,一旦运行了两个函数,输出应该是这样的:

<ul id='folderList'>
    <li class="sub-directory"><span>sub-directory-name</span>
        <ul>
            <li class="file><span>fileName1</span></li>
            <li class="file><span>fileName2</span></li>
        </ul>
    </li>
    <li class="file><span>fileName3</span></li>
</ul>

2 个答案:

答案 0 :(得分:2)

这是获取主目录和子目录的简单函数

function listdir($dir){
    $ffs = scandir($dir);
    echo '<ol>';
    foreach($ffs as $ff){
        if($ff != '.' && $ff != '..'){
            echo '<li>'.$ff;
            if(is_dir($dir.'/'.$ff)) listdir($dir.'/'.$ff);
            echo '</li>';
        }
    }
    echo '</ol>';
}

listdir('Main Dir');

答案 1 :(得分:1)

你可以使用bekow函数以表格格式列出......

function dirToArray($dir)
        {
            $cdir = scandir($dir);
            echo "<table>";
            foreach ($cdir as $key => $value)
            {
                echo "<tr>";
                if (!in_array($value, array(".")))
                {
                    if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
                    {
                            $path = $dir . DIRECTORY_SEPARATOR . $value;
                            echo "<td><a href='file_name.php?dir=$path' >" . $value . "</a></td>";

                    }
                    else
                    {
                        $path = $dir . DIRECTORY_SEPARATOR . $value;
                        echo "<td></td><td><a>". $value . "</a></td>";
                    }
                }
                echo "</tr>";
            }
            echo "</table>";

        }

dirToArray($dir);