【发布时间】:2016-04-14 18:18:24
【问题描述】:
使用有关此主题的先前问题,我已经能够创建一个递归函数来在菜单中显示目录的内容,但是,当涉及到实际文件名时,我遇到了递归深度问题。
当目录的深度增加时,我无法弄清楚如何存储/引用父目录路径以使 href 正确。
使用下面的代码和一个示例目录结构,例如我为 href 创建的文件路径下面,它适用于顶级目录,但我需要一种方法来保留父目录路径,因为它在目录结构中更深入。 InnerSection 中的 file.html 链接例如简单生成为 file/InnerSection/file.html 而不是 files/Section2/Innersection/file.html。
任何帮助将不胜感激。
文件
第一节
第二节
文件.html
内部部分
文件.html
function findDir($path){
$dir=directory_map($path, 0);
return $this->recursive($dir, $path);
}
function recursive($arr, $path) {
global $menu;
global $current_path;
foreach ($arr as $key => $val) {
if (is_array($val)){
$current_path =rtrim($key, '\\');
$menu.= "<li data-role='collapsible' data-iconpos='right' data-shadow='false' data-corners='false'>";
$menu.= "<h3>".rtrim($key, "\\")."</h3>";
$menu.= "<ul data-role='listview' data-shadow='false' data-inset='true' data-corners='false'>";
$this->recursive($val, $path);
$menu.= "</ul></li>"; //finish directory listing
} else {
$menu.= "<li><a class='load-file' data-file='". $path."/".$current_path."/".$val . "' href='". $path . "/" . $current_path . "/" . "$val''>".$val."</a></li>"; //List file
}
}
return $menu;
}
【问题讨论】:
-
不会像stackoverflow.com/a/2207739/208809 这样简单得多吗?
-
感谢 Gordon 的回复,老实说,对我来说这似乎更复杂(也许我对它的理解不够)但它也有一个问题,就像我遇到的许多其他问题一样在网上发现,它们在执行时会回显,而不是附加到返回的变量,这对我正在做的事情至关重要。
-
那我不明白你的问题。为什么这是必不可少的?你想呈现一个目录列表,所以只是回显它。将字符串存储在迭代器中,并在迭代后使用一种方法来检索它。或者将其包装到输出缓冲区中。
-
恐怕我没有足够的经验来理解你的建议。但是,我可以尝试解释为什么我认为它是必不可少的。我有一个函数,它在基本控制器中返回菜单字符串,我正在扩展所有后续控制器,每个控制器都需要显示不同目录的内容。因此,我觉得只是调用一个函数,将字符串存储在一个变量中,然后将该变量传递给视图以在页面上呈现它是处理它的最佳方法。
-
虽然您可以这样做,但控制器的职责不是呈现 HTML。控制器可以做的是在没有附加任何特定渲染的情况下获取目录列表,例如它可以为视图设置一个 RecursiveDirectoryIterator。渲染属于视图的责任,例如在视图中,您可以使用我在该问题中显示的迭代器,将 DirectoryIterator 传递给它并将其呈现为 HTML 列表。见stackoverflow.com/questions/3563863/read-files-in-folder/…
标签: php codeigniter recursion