我目前正在开发一个自己的项目。其中一部分是,给出一个文件路径,它搜索所有文件和子文件夹的路径/文件夹,并将它们添加到数组中。
此代码将文件路径“../”发送到函数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
答案 0 :(得分:2)
意见:我建议使用输出多维数组,使用json_encode()
将其转换为JSON,然后在前端实现类似jsTree
的内容来处理可折叠节点。
虽然可以从头开始编写类似这样的东西,但是当它已经在你之前完成时,这是很多工作。
也就是说,如果你决定自己做,你会发现输出数组,因为JSON在前端更容易设计样式,因为它本身可以转录为Javascript对象。
也是一个#protip:如果你把结果作为JSON输出到一个单独的PHP文件中,那么说你的代码结构是这样的......
/index.php
/data/json.php
...确保json.php
有the correct header set。
新解决方案,所以好:
PHP具有内置的RecursiveDirectoryIterator
和DomDocument
类。您可以一起使用它们一次完成整个递归文件夹转储。对@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);