2015-12-20 20 views
0

我正在嘗試製作一個圖像庫,用於掃描主目錄併爲每個子目錄創建一個單獨的相冊。PHP從目錄和子目錄中創建圖像庫

我的結構與此類似:

-Gallery --Subdir 1 ---圖像1 ---圖像2 --Subdir 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>"; 
} 
+0

「它不起作用」並不是一個非常明確的問題描述。你可以說得更詳細點嗎? – Blackwood

+0

它什麼也沒做。回聲中沒有寫入任何內容。沒有錯誤和我的錯誤報告。也沒有任何錯誤記錄。 –

+0

輸出'var_dump($ dirs);'或者可能是glob中指定的路徑是錯誤的 –

回答

1

*.{jpg,png,gif}像在此之前只需要添加一個/

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

這是因爲$val沒有該目錄的最終/

+1

接受因爲這固定我最初的問題 –

+0

@JesseElser太棒了!我再說一次,我很高興即使在最細微的細節下也能幫上忙。快樂的編碼! – Zeke

1

你可能會考慮使用「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解決您的目錄VS文件。這裏是一個片段

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

如果你讓一個遞歸函數,你可以真正擁有它穿越了一些子目錄創建畫廊內的畫廊。

我也發現了這個神奇的小片段,這是非常優雅的另一個棧的問題:你的情況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 />'; 
+0

有點新到PHP我不知道如何將其應用到我當前的腳本中。 –

1

使用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 OS的 正確目錄分隔符,避免抓取'。'和'..'dir 鏈接級別。
  • 您可以用$ it-> setMaxDepth(5)限制掃描深度;
+0

這是一個建在圖書館或third.party我必須執行? –

+0

SPL(標準PHP庫)請看這裏:http://php.net/manual/en/spl.installation.php, 它不是一個本地庫,它是一個完全集成的PHP擴展(在編譯php時),因爲PHP 5(這就是爲什麼經常被認爲是原生的..) 這將工作以及,如果你在php> = 5 沒有什麼是必需的! – MTroy