在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;