Можно ли пропустить первое (.) И второе значение (..) функции scandir в PHP при поиске файлов или каталогов? - PullRequest
0 голосов
/ 25 апреля 2019

Я на самом деле спрашиваю об этом сам в течение многих лет: это сохранить, чтобы пропустить первое и второе значение массива, извлеченного 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 a scandir, я всегда получаю и получаютакая структура:

var_dump( scandir('path/to/dir/') );
array(
    0 => '.',  // is this the case for each
    1 => '..', // and every environment
    2 => 'filename.ext',
    [...]
)

Но я в основном работаю в своей собственной серверной среде и не видел слишком много разных серверных сред.Поэтому могу ли я быть уверен, что в каждой среде (ОС, версии PHP и т. Д.) Я найду структуру, извлеченную с помощью scandir, которая будет похожа на приведенную выше?

1 Ответ

2 голосов
/ 25 апреля 2019

Нет, вы не можете с уверенностью предположить, что . и .. будут возвращены первыми.

По умолчанию результаты из scandir() возвращаются в алфавитном порядке, как если бы результат был передан в sort(). Однако есть символы, которые будут сортироваться выше . - например, файл с именем !README будет возвращен до ..

Если вы хотите пропустить эти записи, проверьте их явно, например,

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

    // do stuff with $file
}
...