多年来我实际上一直在问自己:
是否可以跳过由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',
[...]
)
但是我主要在自己的服务器环境中工作,没有看到太多不同的服务器环境。因此,我可以确定在每种环境(操作系统,PHP版本等)中,我都将找到由scandir
所获取的结构,该结构看起来类似于上面的结构吗?
答案 0 :(得分:2)
否,您不能安全地假设将首先返回.
和..
。
默认情况下,scandir()
的结果按字母顺序返回,就像结果已传递给sort()
一样。但是,有些字符会在.
上方排序-例如,将在!README
之前返回名为.
的文件。
如果要跳过这些条目,请明确检查它们,例如
foreach (scandir("path/to/dir") as $file) {
if ($file === "." || $file === "..")
continue;
// do stuff with $file
}