首页 > 解决方案 > 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>

如果有人知道问题是什么...

非常感谢你能给我的帮助。

标签: phpforeach

解决方案


位置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>';

推荐阅读