php scandir создает дополнительные элементы (2 точки)

Hi,

У меня есть следующие файлы в каталоге с именем content: ТОЛЬКО index.php, page1.php, page2.php и page3.php.

Тогда у меня есть этот код:

 $column = scandir("content");
 foreach ($column as $value) {   
  $stvalue = str_replace(".php", "", $value);    
  echo "<div>$stvalue</div>";
}

Тем не менее, вот что я получаю:

<div>.</div>
<div>..</div>
<div>index</div>
<div>page1</div>
<div>page2</div>
<div>page3</div>

Что с первыми двумя элементами? У меня нет файлов с такими именами, поэтому я не понимаю.

Спасибо.


person Cain Nuke    schedule 28.04.2016    source источник
comment
Точка (.) и двойная точка (..) — это каталоги Linux. Они есть в каждой папке. Точка (.) ссылается на текущий каталог, а двойная точка (..) ссылается на родительский каталог   -  person MaD    schedule 28.04.2016
comment
Я могу понять это, но они не должны появляться, потому что они мне не нужны. Как я могу избавиться от них? К тому же я даже не на линуксе, а на винде.   -  person Cain Nuke    schedule 28.04.2016
comment
Вы можете фильтровать специальные каталоги. Использование array_diff или явная проверка их с помощью оператора if. вы можете использовать функцию glob(), например, для получения только файлов .php. Таким образом, вы избегаете специальных каталогов, но будьте осторожны, так как будут показаны только файлы .php. Например. глобус (*.php);   -  person MaD    schedule 28.04.2016
comment
Вы имеете в виду, как с preg_match?   -  person Cain Nuke    schedule 28.04.2016
comment
Некоторые варианты, о которых я могу подумать: glob(*.php); или $files = array_diff(scandir(content), array('..', '.')); или if($value != '.' и $value != '..') { ... }   -  person MaD    schedule 28.04.2016
comment
Спасибо. Думаю, я буду использовать array_diff(scandir(content), array('..', '.')); потому что выглядит как более короткий путь.   -  person Cain Nuke    schedule 28.04.2016
comment
Если мой ответ действительно помог вам. Пожалуйста, примите это. Спасибо.   -  person MaD    schedule 28.04.2016


Ответы (3)


. - это специальный каталог, ссылающийся на текущий каталог.

.. - также является специальным каталогом и ссылается на родительский каталог.

Чтобы удалить специальные каталоги, я могу придумать несколько вариантов:

1.

foreach(glob("*.php") as $filename) {
    echo "<div>$filename</div>";
}

2.

$files = array_diff(scandir("content"), array('..', '.'));
foreach($files as $file) { ... }

3.

foreach ($files as $file) {    
    if($file != '.' and $file != '..') { ... } 
}

Все вышеперечисленное является альтернативой. Вам не нужно использовать scandir(), если вы используете glob(), и наоборот. glob() - ожидает шаблон. Также можно указать путь следующим образом:
glob("[path]/*.php") — здесь будут перечислены все php-файлы, расположенные по указанному пути. glob() документацию можно найти здесь PHP - glob()

person MaD    schedule 28.04.2016

. относится к текущему каталогу. .. относится к родительскому каталогу. Вот почему ввод cd .. в командной строке изменит родительский каталог. Так было в DOS, во всех версиях Windows, в Mac OS X, а не только в вариантах Linux и UNIX.

Если вы не хотите отображать их на своей странице, просто пропустите первые две записи, используя array_slice.

person sahuk    schedule 28.04.2016

person    schedule
comment
Лучше добавить некоторые пояснения к ответам только на код. - person Hamid Pourjam; 28.04.2016