You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中使用scandir()函数如何排除.和..目录?

解决scandir()输出.和..的过滤问题

嘿,我一眼就看到你卡在哪了——scandir默认会返回当前目录(.)和上级目录(..),而你现有的过滤条件逻辑出了点小问题,导致没成功过滤掉它们。

问题出在哪?

你写的判断条件是:

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

这个逻辑永远为真!因为任何一个值,要么不等于.,要么不等于..(比如当$value是.时,它确实不等于..,所以条件成立)。咱们得把逻辑改成同时不等于.和..,也就是用&&而不是||。

修正后的代码

这是调整后的版本,能正确过滤掉两个默认目录:

<?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>"); 
        } 
    } 
} 
?>

其他更简洁的方法

如果你想让代码更清爽,还有几种可选方案:

  1. 用array_diff直接过滤结果
    先获取scandir的结果,再直接移除.和..:

    <?php
    $dir = "pages";
    $files = scandir($dir);
    // 过滤掉不需要的目录
    $filteredFiles = array_diff($files, ['.', '..']);
    if ($filteredFiles) {
        foreach ($filteredFiles as $value) {
            echo("<script>console.log(\"$value\")</script>");
            echo("<p><a href=\"$dir/$value\">$value</a></p>");
        }
    }
    ?>
    
  2. 用glob函数替代scandir
    glob可以直接返回指定目录下的文件/目录,默认不会包含.和..:

    <?php
    $dir = "pages";
    // 匹配目录下所有项目,GLOB_MARK会给目录加斜杠(可选)
    $files = glob("$dir/*");
    if ($files) {
        foreach ($files as $path) {
            // 获取文件名部分
            $value = basename($path);
            echo("<script>console.log(\"$value\")</script>");
            echo("<p><a href=\"$path\">$value</a></p>");
        }
    }
    ?>
    

内容的提问来源于stack exchange,提问作者R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:27