【问题标题】:PHP Create Image Gallery From Directory And SubdirectoriesPHP从目录和子目录创建图片库
【发布时间】:2015-12-20 11:40:51
【问题描述】:

我正在尝试制作一个扫描主目录并为每个子目录创建单独相册的图片库。

我的结构是这样的:

-图库 --子目录 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>&raquo;</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>";
}

【问题讨论】:

  • “它不起作用”对问题的描述不是很清楚。你能说得更具体点吗?
  • 它什么都不做。回声中没有写入任何内容。没有错误,我的错误报告已开启。也没有任何错误记录。
  • 输出var_dump($dirs);或者可能是glob中指定的路径错误
  • 路径错误。但是当我修复它时,结果是每个子目录名称都被列为标题元素,但没有产生图像
  • 我认为它没有返回文件,因为您没有在*.{jpg,png,gif} 之前添加/(斜杠)。我认为$val 没有最后的斜线(这只是一个猜测)。

标签: php


【解决方案1】:

只需在*.{jpg,png,gif} 之前添加一个/,如下所示:

$files = glob($val.'/*.{jpg,png,gif}', GLOB_BRACE);

这是因为$val 没有该目录的最终/

【讨论】:

  • 接受,因为这解决了我最初的问题
  • @JesseElser 太好了!我再说一遍,我很高兴即使是最微小的细节也能提供帮助。编码愉快!
【解决方案2】:

您可以考虑使用“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 结合使用,以解析您的目录与文件。这是一个sn-p

<?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);
    }
?>

如果你让它成为一个递归函数,你实际上可以让它遍历许多子目录,在画廊中创建画廊。

我还在另一个堆栈问题上发现了这个非常优雅的小 sn-p:Get Images In Directory and Subdirectory With Glob

$rdi = new RecursiveDirectoryIterator("uploads/prevImgs/");
$it = new RecursiveIteratorIterator($rdi);
foreach($it as $oneThing)
    if (is_file($oneThing))
        echo '<img src="'.$oneThing.'" /><br />';

【讨论】:

  • 对 php 有点陌生,我不知道如何在我当前的脚本中使用它。
【解决方案3】:

使用 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 Documentation

  • DIRECTORY_SEPARATOR 是一个跨平台常量,将使用 执行代码的操作系统的正确目录分隔符
  • FilesystemIterator::SKIP_DOTS,避免获取'.'和 '..' 目录 链接级别。
  • 您可以使用 $it->setMaxDepth(5); 限制扫描深度

【讨论】:

  • 这是我必须实现的内置库还是第三方?
  • SPL(标准 PHP 库)看这里:php.net/manual/en/spl.installation.php,它不是原生库,它是自 PHP 5 以来完全集成的 PHP 扩展(在 php 编译时)(这就是为什么通常被认为是native..) 如果你在 php >= 5 上,它也可以工作,不需要任何东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多