Php _dir是否未按预期工作

Php _dir是否未按预期工作,php,arrays,directory,dir,Php,Arrays,Directory,Dir,我在迭代某个目录中的所有文件时,使用is_dir时遇到了一个问题。 代码有点小,所以我想如果我发布它,你会更好地理解我的意思: $files = array(); if ($dir = @opendir($folder)){ while($file = readdir($dir)){ if (is_dir($file)) $files[] = $file; } closedir($dir); } print_r($fil

我在迭代某个目录中的所有文件时,使用is_dir时遇到了一个问题。 代码有点小,所以我想如果我发布它,你会更好地理解我的意思:

 $files = array();

 if ($dir = @opendir($folder)){ 

    while($file = readdir($dir)){

      if (is_dir($file)) $files[] = $file;  
    }        
    closedir($dir);    
}
print_r($files)
它转储: ([0]=>)

否则,如果我不使用以下代码检查文件是否为dir:

 $files = array();

if ($dir = @opendir($folder)){ 

    while($file = readdir($dir)){

      $files[] = $file;  
    }        
    closedir($dir);    
}
print_r($files)
它转储了预期的内容: ([0]=>..[1]=>bla[2]=>blabla[3]=>index.php[4]=>style.css[5]=>)

我想使用$file变量作为参数只是一个noob问题,但不知道如何使其工作


谢谢你的阅读

问题是:$file只包含basename,而不包含绝对文件名。因此,请在文件夹的路径前添加前缀:

is_dir($folder . '/' . $file)

正如Kolink在评论中所说,您最好选择
glob
路线,但如果您决定坚持使用opendir:

路径将为$folder.'/'$文件,而不仅仅是$file。opendir()返回相对路径。所以is_dir在循环中返回false

if ($dir = opendir($folder)){ 

    while(false !== ($file = readdir($dir))) {
        if ($file == '.' || $file == '..') {
            continue;
        } else if (is_dir($folder . '/' . $file)) {
            $files[] = $file;
        }
    }   

    closedir($dir);    

}

另外,请注意
false==。这是必要的,因为名为“0”的文件夹将计算为false(或其他一些边缘情况)。此外,您很少真正关心
,因此代码在那里可以过滤


<? // findfiles.php  -  what is in directory "videoarchive"
$dir    = 'images/videoarchive/'; // path from top
$files = scandir($dir);
$files_n = count($files);

echo '<br>There are '.$files_n.' records in directory '.$dir.'<br>' ;

$i=0;
while($i<=$files_n){
    // "is_dir" only works from top directory, so append the $dir before the file
    if (is_dir($dir.'/'.$files[$i])){   
        $MyFileType[$i] = "D" ; // D for Directory
    } else{
        $MyFileType[$i] = "F" ; // F for File
    }
    // print itemNo, itemType(D/F) and itemname
    echo '<br>'.$i.'. '. $MyFileType[$i].'. ' .$files[$i] ;
    $i++;
}
?>

是否只需要所有子目录的列表?如果是这样,请使用glob(),因为您似乎正在为之重新发明轮子。如果是这种情况,问题已经解决;)好的,问题解决了,多亏了你们,速度非常快,不知道这个glob选项,也不知道opendir的相对路径。谢谢<代码>
是自动出现在每个目录中的特殊目录<代码>=当前目录,
=父目录。除非过滤掉它们,否则它们将始终显示在opendir/readdir中。检查您在$file中得到的内容。如果您只获得文件名,那么请在父目录路径前添加前缀谢谢您的回答。正如我在第一条评论中所说,已经解决了这个问题。