2017-10-10 99 views
1

请参阅我尝试过的以下代码。如何打印目录和子目录的列表以及子目录中的文件

echo scanDirectoryImages("Images"); 


function scanDirectoryImages($directory, array $exts = array('jpeg', 'jpg', 
'gif', 'png')) 
{ 

$html = ''; 
if (
    is_readable($directory) 
    && (file_exists($directory) || is_dir($directory)) 
) { 
    $directoryList = opendir($directory); 
    while($file = readdir($directoryList)) { 
     if ($file != '.' && $file != '..') { 
      $path = $directory . '/' . $file; 
      if (is_readable($path)) { 
       if (is_dir($path)) { 
        return scanDirectoryImages($path, $exts); 
       } 
       if (
        is_file($path) 
        && in_array(end(explode('.', end(explode('/', $path)))), 
$exts) 
       ) { 
        $html .= '<img src="' . $path 
         . '" style="max-height:200px;max-width:200px" 
value="<?php echo basename($path)"/> '; 
       } 
      } 
     } 
    } 
    closedir($directoryList); 
} 
return $html; 
} 

它只返回从我的子目录中的图像,而不是我真正想要的子目录的路径。 此外,我在一个服务器上工作,而不是本地主机,这是创建一个问题,以设置$路径。 请帮忙!!!

+1

这是一个递归函数。如果你使用参数('jpeg','jpg','png','gif')调用函数,那么它只会列出图像。 您需要做的不仅仅是复制粘贴代码,而是理解它并对其进行修改,使其符合您的需求。 ($ path)){ return scanDirectoryImages($ path,$ exts);你对此感兴趣。只是为了向您指出正确的方向 – Nico

回答

2

我想告诉你一个非常简单的方法,从目录中获取具有特定扩展名的所有文件。

这使得利用各种Iterators和过滤器

FilterIterator::accept()是哪个文件包含在迭代规则。

class ImagesOnlyFilterIterator extends FilterIterator 
{ 
    function accept() 
    { 
    return in_array(strtolower($this->current()->getExtension()), array('jpeg', 'jpg', 'gif', 'png', 'bmp', 'tif', 'tiff'), true); 
    } 
} 

$path = '/foo/bar/whatever'; 

foreach(new ImagesOnlyFilterIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path))) as $image) 
{ 
    echo $image . PHP_EOL; 
} 

$image实际上是一个SplFileInfo对象,将包含其他各种属性供您使用。

+1

对in_array使用严格模式。 https://eval.in/89008/ https://www.reddit.com/r/lolphp/comments/1v7ek6/in_which_in_array_does_crazy_stuff/ – hanshenrik

+0

@hanshenrik可能不是一个问题,因为在strtolower中包装的getExtension只能返回字符串。但很高兴添加它。 – Scuzzy

相关问题