"."在哪里(点)来自使用 PHP ´scandir´

Where does "." (dot) come from when using PHP ´scandir´

我有点糊涂
我正在构建一个 PHP 函数来循环输出指定目录中的图像。

PHP

$dir = "bilder/".$objekt[0]['objekt_nr']."/thumbnail/";
$thumbnails = scandir($dir);

print_r($thumbnails);

foreach ($thumbnails as $value) {
   echo "<img src='".$dir.$value. "'>";
}

数组

(
[0] => .
[1] => ..
[2] => bjornc.jpg
[3] => test_bild3.jpg
)

HTML

<img src='bilder/22159/thumbnail/.'>
<img src='bilder/22159/thumbnail/..'>
<img src='bilder/22159/thumbnail/bjornc.jpg'>
<img src='bilder/22159/thumbnail/test_bild3.jpg'>

我怎样才能去掉这些点?
我猜是目录点..

更新

在 php.net 手册中找到了最简单的方法

$thumbnails = array_diff(scandir($dir), array('..', '.'));

点目录是当前目录。点点是目录。

如果你想在一个目录中创建一个文件列表,你真的应该跳过这两个,或者真的 any 以前导点开头的目录(在 POSIX Linux 和 OSX 等系统应该是隐藏目录)。

你可以通过简单地检查文件名中的第一个字符是否是一个点来做到这一点,如果它只是跳过它(即你 continue 循环)。

您可以使用 in_array 作为

跳过它
foreach ($thumbnails as $value) {
    if (!in_array($value, array(".", ".."))) {
        echo "<img src='" . $dir . $value . "'>";
    }
}

它们是目录和父目录,可以使用以下代码删除它们:

    <?php
    $dir = "downloads/";
    if (is_dir($dir)){
        if ($dir_handler = opendir($dir)){
            while (($file = readdir($dir_handler)) !== false){
                if ($file!="."&&$file!="..") {
                    //your code
                }
            }
        closedir($dir_handler);
        }
    }
    ?>

你也可以用这个

foreach ($thumbnails as $value) {
   if ( $value !='.' && $value !='..')
   {
     echo "<img src='".$dir.$value. "'>";
   }  
}

如果您要查找特定的文件类型,例如图像,最好使用 glob
它允许您传递扩展模式。
这样您就可以确保只获取您要查找的文件。

多种文件类型的示例,.jpg.png

$dir = "bilder/".$objekt[0]['objekt_nr']."/thumbnail/";
$files = glob("*.{jpg,png}", GLOB_BRACE);

print_r($files);

GLOB_BRACE - Expands {a,b,c} to match 'a', 'b', or 'c'

单个文件类型的示例,.jpg

$dir = "bilder/".$objekt[0]['objekt_nr']."/thumbnail/";
$files = glob("*.jpg");

print_r($files);

@joachim Pileborg 的回答是正确的,顺便说一下你也可以使用 glob()

$thumbnails = glob("$dir/*.jpg");

foreach ($thumbnails as $value) {
   echo "<img src='$value'/>";
}