PHP scandir(): 如何防止回显'.'和'..'目录?



在PHP中遇到一些关于scandir()函数的问题。

尝试回显

当前目录中的文件列表时,它会回显...作为目录。我试图像这样过滤掉这些:

<?php
$dir = "pages";
if ($d = scandir($dir)) {
    foreach ($d as $value) {
        echo("<script>console.log("$value")</script>");
        if ($value !== '.' || $value !== '..') {
            echo("<p><a href="$dir/$value">$value</a></p>");
        } else {
            echo("");
        }
    }
}

我觉得我错过了显而易见的东西。

有人有什么想法吗?

-R

根据文档,scandir()从目标目录返回文件和目录数组。所以你可以使用 array_diff ,它最终将返回一个数组,其中包含第一个数组中第二个数组中不存在的所有条目:

array_diff(scandir($directory), ['..', '.']);

或者,如果你懒得这样做,你实际上可以array_shift前两个元素:

$dir = "pages";
if($d = scandir($dir)) {
    array_shift($d);
    array_shift($d);
    ...
}

我喜欢这样做:

   $dir = "pages";
   if($d = scandir($dir)) {
        foreach($d as $file){
            if(substr($file,0,1) == '.') continue;
            echo "$filen";
        }
   }

这样,它会跳过从.(如.htaccess等(开始的所有$file

但是我的项目中有很多这样的东西:

 .
 ..
 .buildpath
 .git
 .gitignore
 .htaccess
 .project
 .settings

我会使用 is_file((。它还将避免目录。

$dir = "pages";
if ($d = scandir($dir)) {
    foreach ($d as $value) {
        echo("<script>console.log("$value")</script>");
        if (is_file($value)) {
            echo("<p><a href="$dir/$value">$value</a></p>");
        } else {
            echo("");
        }
    }
}

当你找到...时继续你的循环

只需将其添加到foreach块的第一行:

if($value == '.' || $value == '..') continue;
# your rest of codes

if(in_array($value, array(".",".."))) continue;
# your rest of codes
代码中的

if ($value !== '.' || $value !== '..') {

当$value等于"."时,它肯定不会同时等于"..",所以"||"的一面对于"."为真,另一侧为"..",总体结果将为真。

您需要:

if ($value !== '.' && $value !== '..') {

if ($value == '.' || $value == '..') continue;

最新更新