2

我正在尝试为主文件夹中的每个目录构建一个<ul>列表。<li>这是我的代码:

<?php

$dir = opendir(getEnv("DOCUMENT_ROOT") . "/folder");

while(($file = readdir($dir)) !== false ){
  if( is_dir($file) && $file !== "." && $file !== ".." ){
    echo "<li>" . $file . "</li>";
  }
}

closedir($dir);

?>

/home/example/folder 中有两个目录,但没有被识别为文件夹(当然它们是!)

如果我“ echo”在while循环中打印它们(它们很好地存在于脚本中,那一侧没有问题)。如果我尝试“ filetype”它们,lstat failed则会引发错误,我在互联网上搜索了它的含义,但最终得到的只是我很难理解的技术支持。

4

2 回答 2

5

你的问题是在“文件夹”目录中你可以有两个目录(a和b),然后读取检索“a”和“b”作为文件名,而is_dir接收完整路径文件名或相对文件名,你有两个选项:

  1. 将文件名的完整路径传递给 is_dir 函数(参见示例代码)。
  2. 传递相对路径(取决于您放置脚本的位置)。
if( is_dir($dir . "/" . $file) && $file !== "." && $file !== ".." ){ ......
于 2011-08-11T16:49:22.743 回答
0

尝试:

while($file = readdir($dir)) {
   if (...) { }
}

!== false部分不是必需的。如果 readdir 到达末尾,则返回 false,循环将自动终止。您的版本被解析为:

$file gets the value of (readdir($file) is not false)

例如,您分配的是布尔结果readdir($file) !== false,而不是 readdir 的返回值。


扩展我在下面关于运算符优先级的评论:

PHP 的循环设置解析树如下所示,展开后:

$bool = (readdir($dir) !== false);
$file = $bool;

要解决此问题,请完全删除 !== false 部分,或使用额外的括号强制您自己的优先级:

($file = readdir($dir)) !== false
于 2011-08-11T16:33:09.230 回答