搜索文件或目录时跳过PHPs scandir函数的第一个(.)和第二个值(..)是否省事?
Is it save to skip the first (.) and second value (..) of PHPs scandir function when searching for files or directories?
多年来我一直在问这个问题:
跳过scandir
获取的数组的第一个和第二个值是否省事?
现在我正在遍历 scandir
(或多或少)获取的数组,如下所示:
for ( $scan = scandir('path/to/dir/'), $i = 0, $c = count( $scan ); $i < $c; ++$i )
{
if ( $scan[ $i ][ 0 ] != '.' )
{
// $scan[ $i ] is file name or dir name
}
}
这也很好用,但如果 $scan[ 0 ][ 0 ]
总是 .
并且 $scan[ 1 ][ 0 ]
总是 ..
.
,这似乎是多余的
那么像这样跳过第一个和第二个值是不是省事了:
for ( $scan = scandir('path/to/dir/'), $i = 2/* starting with 2 instead of 0 */, $c = count( $scan ); $i < $c; ++$i )
{
// $scan[ $i ] is file name or dir name
}
当我 var_dump
一个 scandir
我总是得到这样的结构:
var_dump( scandir('path/to/dir/') );
array(
0 => '.', // is this the case for each
1 => '..', // and every environment
2 => 'filename.ext',
[...]
)
但我主要在自己的服务器环境中工作,并没有看到太多不同的服务器环境。那么我能否确定在每个环境(OS、PHP 版本等)中我都会找到一个由 scandir
获取的结构,它看起来与上面的相似?
不,您不能安全地假设 .
和 ..
将首先返回。
默认情况下,scandir()
的结果按字母顺序返回,就像结果已传递给 sort()
一样。但是,有些字符会排在 .
之上——例如,名为 !README
的文件将在 .
.
之前返回
如果您想跳过这些条目,请明确检查它们,例如
foreach (scandir("path/to/dir") as $file) {
if ($file === "." || $file === "..")
continue;
// do stuff with $file
}
多年来我一直在问这个问题:
跳过scandir
获取的数组的第一个和第二个值是否省事?
现在我正在遍历 scandir
(或多或少)获取的数组,如下所示:
for ( $scan = scandir('path/to/dir/'), $i = 0, $c = count( $scan ); $i < $c; ++$i )
{
if ( $scan[ $i ][ 0 ] != '.' )
{
// $scan[ $i ] is file name or dir name
}
}
这也很好用,但如果 $scan[ 0 ][ 0 ]
总是 .
并且 $scan[ 1 ][ 0 ]
总是 ..
.
那么像这样跳过第一个和第二个值是不是省事了:
for ( $scan = scandir('path/to/dir/'), $i = 2/* starting with 2 instead of 0 */, $c = count( $scan ); $i < $c; ++$i )
{
// $scan[ $i ] is file name or dir name
}
当我 var_dump
一个 scandir
我总是得到这样的结构:
var_dump( scandir('path/to/dir/') );
array(
0 => '.', // is this the case for each
1 => '..', // and every environment
2 => 'filename.ext',
[...]
)
但我主要在自己的服务器环境中工作,并没有看到太多不同的服务器环境。那么我能否确定在每个环境(OS、PHP 版本等)中我都会找到一个由 scandir
获取的结构,它看起来与上面的相似?
不,您不能安全地假设 .
和 ..
将首先返回。
默认情况下,scandir()
的结果按字母顺序返回,就像结果已传递给 sort()
一样。但是,有些字符会排在 .
之上——例如,名为 !README
的文件将在 .
.
如果您想跳过这些条目,请明确检查它们,例如
foreach (scandir("path/to/dir") as $file) {
if ($file === "." || $file === "..")
continue;
// do stuff with $file
}