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

PHP is_dir函数在不同运行目录下返回结果不一致问题排查

PHP目录识别异常问题的原因与解决办法

问题根源

你遇到的核心问题是路径相对性导致的is_dir判断错误:

  • scandir($_SERVER["DOCUMENT_ROOT"])返回的是网站根目录下的文件名/目录名(比如directory1、img),但这些都是相对根目录的短名称,不是完整路径。
  • array_filter($dirs, 'is_dir')调用is_dir时,默认以当前脚本的工作目录为基准检查路径:
    • 根目录的index.php运行时,工作目录就是根目录,is_dir('directory1')等价于检查根目录/directory1,自然能识别为目录。
    • directory1/index.php运行时,工作目录变成了根目录/directory1,此时is_dir('directory1')实际检查的是根目录/directory1/directory1——这个路径不存在,所以只有.和..(相对当前工作目录的特殊目录)能通过判断。

修复方案

必须让is_dir基于完整路径判断,以下两种方法都可以解决:

方案1:自定义回调拼接完整路径

修改array_filter的回调函数,把根目录路径和文件名拼接后再判断:

<?php 
    $root = $_SERVER["DOCUMENT_ROOT"];
    $dirs = scandir($root);
    // 自定义回调,用完整路径判断是否为目录
    $dirs = array_filter($dirs, function($item) use ($root) {
        return is_dir($root . '/' . $item);
    });
    $dirs = array_diff($dirs, ['img','imports','.','..']);
    foreach ($dirs as $dir) {
        echo('<a href="/'.$dir.'">
        <p>
        '.ucwords(str_replace('-',' ',$dir)).'
        </p></a>');
    }
?>

方案2:先生成完整路径再过滤

先把所有扫描到的项转换成完整路径,过滤后再提取回原目录名:

<?php 
    $root = $_SERVER["DOCUMENT_ROOT"];
    // 生成所有项的完整路径
    $fullPaths = array_map(function($item) use ($root) {
        return $root . '/' . $item;
    }, scandir($root));
    // 过滤出目录
    $dirPaths = array_filter($fullPaths, 'is_dir');
    // 提取目录名
    $dirs = array_map('basename', $dirPaths);
    $dirs = array_diff($dirs, ['img','imports','.','..']);
    foreach ($dirs as $dir) {
        echo('<a href="/'.$dir.'">
        <p>
        '.ucwords(str_replace('-',' ',$dir)).'
        </p></a>');
    }
?>

这两种方案都能确保is_dir判断的是网站根目录下的真实路径,不会受当前脚本所在目录的影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:18:18