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
相关产品推荐
相关产品推荐

