动态PHP文件数组列出项目

时间:2013-12-19 21:34:54

标签: php arrays file list dynamic

我目前正在开发一个自己的项目。其中一部分是,给出一个文件路径,它搜索所有文件和子文件夹的路径/文件夹,并将它们添加到数组中。

此代码将文件路径“../”发送到函数wps_files,并从中创建一个完整的多维数组。

HTML.php

<?php               
    echo '<pre>';
    print_r( wps_files('../') );
    echo '</pre>';
?>

这是php脚本中的函数。

<?php

function wps_files($path) {
    $wpsdir = Array(
        'Root' => $path,
        'Structure' =>  wps_glob($path)
    );
    return $wpsdir;
}

function wps_glob($dir) {
    foreach (glob($dir . '/*') as $f) {
        if(is_dir($f)) 
        {
            $r[] = array(basename($f) => wps_glob($f));
        } 
        else 
        {
            $r[] = basename($f);
        }
    }
    return $r;
}

现在我想创建一个花哨的css文件树。 所以这是我的问题,我如何从这个数组制作一个正确的书面清单? 如,

每个维度数组都在<ul></ul>内标记,并且该数组中的每个项目也都被<li></li>包围,难以解释,请参阅此代码。这是我想要实现的目标。

<ul>
    <li>ROOT[the file where the search for folders/files starts in]
        <ul>
            <li>Index.php[file inside root]</li>
            <li>Website[folder inside root]
            <li>
                <ul>
                    <li>HTML[folder inside Website]
                        <ul>
                            <li>Index.html</li>
                            <li>Contact.html</li>
                            <li>Info.html</li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

我一直在努力实现这一目标但到目前为止无处可去。 非常感谢帮助,当然也有解释。因为我在这里学习。不要复制粘贴。

非常感谢!

编辑:

这是目前正在显示的内容。它显示数组中的每个文件,但顺序不正确。

0: Index.php
0: Javascript.js
1: Jquery.js
0: Get_Server_files.Script.php
0: General.css
1: Menu.css
2: Style.css
0: WelcomeImage0.png
1: WelcomeImage1.png
2: WelcomeImage2.png
3: WelcomeImage3.png
4: WelcomeImage4.png
5: WelcomeImage5.png
6: WelcomeImage6.png
WelcomeImages: 
0
1: bg.jpg
HTML: 
Javascript: 
Scripts: 
Style: 
images: 
0
1
2: New Text Document.txt
3
4
5

1 个答案:

答案 0 :(得分:2)

意见:我建议使用输出多维数组,使用json_encode()将其转换为JSON,然后在前端实现类似jsTree的内容来处理可折叠节点。

虽然可以从头开始编写类似这样的东西,但是当它已经在你之前完成时,这是很多工作。

也就是说,如果你决定自己做,你会发现输出数组,因为JSON在前端更容易设计样式,因为它本身可以转录为Javascript对象。

也是一个#protip:如果你把结果作为JSON输出到一个单独的PHP文件中,那么说你的代码结构是这样的......

/index.php
/data/json.php

...确保json.phpthe correct header set


新解决方案,所以好:

PHP具有内置的RecursiveDirectoryIteratorDomDocument类。您可以一起使用它们一次完成整个递归文件夹转储。对@Musa original solution的{{3}} 非常感谢

$dir = "/path/to/your/folder";
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));

$dom = new DomDocument("1.0");
$list = $dom->createElement("ul");
$dom->appendChild($list);
$node = $list;
$depth = 0;
foreach($iterator as $name => $item)
{  
    if ($iterator->getDepth() == $depth)
    {
        $li = $dom->createElement('li', $item->getFilename());
        $node->appendChild($li);
    }
    elseif ($iterator->getDepth() > $depth)
    {
        $li = $node->lastChild;
        $ul = $dom->createElement('ul');
        $li->appendChild($ul);
        $ul->appendChild($dom->createElement('li', $item->getFilename()));
        $node = $ul;
    }
    else
    {
        $difference = $depth - $iterator->getDepth();
        for ($i = 0; $i < $difference; $difference--)
            $node = $node->parentNode->parentNode;
        $li = $dom->createElement('li', $item->getFilename());
        $node->appendChild($li);
    }
    $depth = $iterator->getDepth();
}
echo $dom->saveHtml();

旧解决方案,不太好:

但是,由于我们没有这样做,解决方案看起来像:

function arrayToList($array) {
    $output = "<ul>";
    foreach($array as $key => $value)
        {
        if(!is_array($value))
        {
            $output = $output."<li>$key: $value</li>";
        }
        else 
            $output = $output."<li>$key".arrayToList($value)."</li>";
    }
    $output = $output."</ul>";
    return $output; 
}

像这样使用它:

echo arrayToList($yourMultiDimensionalArray);