php - foreach 空 ul
问题描述
我使用这几行代码来列出文件夹和子文件夹。它工作得很好,但我不明白为什么我最终会得到:
<ul></ul>.
这是我的 PHP 代码:
<?php
function listFolder($dir){
$files = preg_grep('/^([^.])/', scandir($dir));
// prevent empty ordered elements
if (count($files) < 1)
return;
echo '<ul>';
foreach($files as $file){
if(is_dir($dir.'/'.$file)) {
echo '<li><a href="view.php?m='. $dir.'/'.$file.'" class="folder">'.$file;
echo '</a>';
listFolder($dir.'/'.$file);
echo '</li>';
}
}
echo '</ul>';
}
echo '<ul class="menu">';
listFolder('mails');
echo '</ul>';
?>
和 HTML 结果
<ul class="menu">
<ul>
<li>
<a href="view.php?m=mails/2020" class="folder">2020</a>
<ul>
<li>
<a href="view.php?m=mails/2020/Janvier" class="folder">Janvier</a>
<ul>
<li><a href="view.php?m=mails/2020/Janvier/semaine1" class="folder">semaine1</a></li>
<li><a href="view.php?m=mails/2020/Janvier/semaine2" class="folder">semaine2</a></li>
<li><a href="view.php?m=mails/2020/Janvier/semaine3" class="folder">semaine3</a></li>
</ul>
</li>
<li>
<a href="view.php?m=mails/2020/Fevrier" class="folder">Fevrier</a>
<ul></ul>
</li>
<li>
<a href="view.php?m=mails/2020/Avril" class="folder">Mars</a>
<ul></ul>
</li>
<li>
<a href="view.php?m=mails/2020/Avril" class="folder">Avril</a>
<ul></ul>
</li>
<li>
<a href="view.php?m=mails/2020/Mai" class="folder">Mai</a>
<ul></ul>
</li>
</ul>
</li>
</ul>
</ul>
如果有人知道问题是什么...
非常感谢你能给我的帮助。
解决方案
位置ul
不正确,见下图
function listFolder($location)
{
if (is_file($location)) {
echo '<li> <a href="view.php?m=' . $location . '">' . basename($location) . '</a></li>';
return;
}
if (!is_dir($location)) {
return;
}
$dirs = scandir($location);
foreach ($dirs as $dir) {
if ($dir == '.' || $dir == '..') {
continue;
}
$path = $location . '/' . $dir;
if (is_file($path)) {
echo '<li> <a href="view.php?m=' . $path . '">' . $dir . '</a></li>';
} else if (is_dir($path)) {
echo '<li><ul>';
listFolder($path);
echo '</ul></li>';
}
}
}
并打电话
echo '<ul class="menu">';
listFolder('/your/path');
echo '</ul>';
编辑:根据您的评论,如果您只想列出文件夹,我会采用glob
方法,确保提供不带斜杠的路径
function listFolder($dir, $parent){
// $files = preg_grep('/^([^.])/', scandir($dir));
$files = glob($dir.'/*', GLOB_ONLYDIR);
if (count($files) < 1)
return;
if(!$parent) echo '<ul>';
foreach($files as $file){
if ($file == '.' || $file == '..') {
continue;
}
if(is_dir($file)) {
echo '<li><a href="view.php?m='.$file.'" class="folder">'.basename($file);
echo '</a>';
listFolder($file,false);
echo '</li>';
}
}
if(!$parent) echo '</ul>';
}
你需要打电话
echo '<ul class="menu">';
listFolder('/your/location',true);
echo '</ul>';
推荐阅读
- javascript - Draft.JS 如何根据自定义实体创建自定义链接或跨度
- google-sheets - 从多个 Google 电子表格中搜索和检索记录
- oracle - 如何将 oracle 11g dmp 文件恢复到全新的 oracle 11g 安装
- r - geom_bar x 轴刻度或标签的问题
- java - JdbcTemplate 的 queryForList 有什么限制吗?
- jmeter - Jmeter - Jmeter - 比较/断言多个数据:来自 JSON 的数据与来自 DB 的数据(单行)
- html - chartjs 中是否有一种方法可以在公共时间线上显示不同的布尔值和 Y 中的偏移量?
- mysql - 在 MySQL 中查找顺序值之间的间隙
- python - 如何按特定列对多级熊猫数据框进行排序?
- regex - 单个元素Angular中的多个正则表达式模式