在搜索文件或目录时是否保存跳过PHPs scandir函数的第一个(。)和第二个值(..)?

问题描述 投票:-1回答:1

我实际上已经问过这个问题多年了:是不是要跳过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提取的结构,它看起来与上面的相似吗?

php scandir
1个回答
2
投票

不,你不能安全地假设...将首先归还。

默认情况下,scandir()的结果按字母顺序返回,就好像结果已传递给sort()一样。但是,有些字符将在.之上排序 - 例如,在!README之前将返回名为.的文件。

如果您想跳过这些条目,请明确检查它们,例如

foreach (scandir("path/to/dir") as $file) {
    if ($file === "." || $file === "..")
        continue;

    // do stuff with $file
}
© www.soinside.com 2019 - 2024. All rights reserved.