我正在尝试制作一个图像库,它扫描主目录并为每个子目录创建一个单独的相册。
我的结构与此类似:
-画廊--细分曲面1---图像1---图像2--细分曲面2---图像1---图像2
我们的想法是,每个相册都将由一个类为web-gallery
的div组成。然后会有一个由子目录名称制成的相册标题的标题。之后,生成每个图像的列表。这将是一个一页的画廊。如果可能的话,我希望有一个变量来设置这样列出的相册数量。如果我有30个子目录,我的页面不会太拥挤。
到目前为止,我已经写了这篇文章,但它不起作用。我没有收到任何错误或日志,尽管它只是不起作用。
$dirs = glob('img/gallery_temp/*', GLOB_ONLYDIR);
foreach($dirs as $val) {
echo '<div class="web-gallery">';
echo "<h3><span>»</span> ".basename($val). "</h3>";
echo '<ul class="web-gallery-list">';
$files = glob($val.'*.{jpg,png,gif}', GLOB_BRACE);
foreach($files as $file) {
echo "<li><a href='".$file."'><img src='" . $file . "' alt='description'></a></li> 'r'n";
}
echo "</ul>";
echo "</div>";
}
只需在*.{jpg,png,gif}
之前添加一个/
,如下所示:
$files = glob($val.'/*.{jpg,png,gif}', GLOB_BRACE);
这是因为$val
没有目录的最终/
。
您可以考虑使用"readdir"而不是glob。Glob用于查找与模式匹配的路径名,请参见此处:http://php.net/manual/en/function.glob.php并且已知有点问题。
Readdir,如果您的目录完全是镜像,则可能更容易使用:http://php.net/manual/en/function.readdir.php
将此与is_dir()结合使用http://php.net/manual/en/function.is-dir.php以解析您的目录与文件。这是的一个片段
<?php
if ($handle = opendir('/galleries')) {
while (false !== ($entry = readdir($handle))) {
// this is a subdirectory
if (is_dir($entry)) {
}
// this is a file
else {
echo $entry;
}
}
closedir($handle);
}
?>
如果你让它成为一个递归函数,你实际上可以让它遍历多个子目录,在库中创建库。
我还发现了这个奇妙的小片段,它在另一个堆栈问题上非常优雅:用Glob 在目录和子目录中获取图像
$rdi = new RecursiveDirectoryIterator("uploads/prevImgs/");
$it = new RecursiveIteratorIterator($rdi);
foreach($it as $oneThing)
if (is_file($oneThing))
echo '<img src="'.$oneThing.'" /><br />';
使用SPL库(PHP>=5)
更好的解决方案是使用SPL库(最跨平台的)
$directory = new RecursiveDirectoryIterator("./img/gallery_temp", FilesystemIterator::SKIP_DOTS);
// Flatten the recursive iterator, folders come before their files
$it = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
foreach($it as $fileinfo)
{
if($fileinfo->isDir())
{
// prevPath used to separate each directory listing and closing the bracket UL list
$prevPath = $it->getSubPath().DIRECTORY_SEPARATOR.$fileinfo->getFilename();
echo sprintf
(
"<div class='web-gallery'>
<h3><span>></span> %s</h3>
<ul>".PHP_EOL,
$fileinfo->getFilename()
);
}
if($fileinfo->isFile())
{
echo sprintf("<li><a href=''><img src='%s/%s' alt='description'></a></li>".PHP_EOL, $it->getSubPath(), $fileinfo->getFilename());
if($prevPath != $it->getSubPath())
echo("</ul>");
}
}
注:更多信息:SPL文档
- DIRECTORY_SEPARATOR是一个跨平台常量,将使用执行代码的操作系统的正确目录分隔符
- FilesystemIterator::SKIP_DOTS,避免获取"."answers".."目录链接级别
- 您可以使用$it->setMaxDepth(5)来限制扫描深度