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>"); } } } ?>
其他更简洁的方法
如果你想让代码更清爽,还有几种可选方案:
用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>"); } } ?>用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
相关产品推荐
相关产品推荐

