2009-07-08 100 views
5

我不知道這是多麼簡單,但我使用的腳本顯示來自特定文件夾的文件,但是我希望它們按字母順序顯示,難以做到這一點嗎?下面是我使用的代碼:它默認的字母順序排列PHP(文件夾)按字母順序排列的文件列表?

if ($handle = opendir($mainframe->getCfg('absolute_path') ."/images/store/")) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       if (($file != "index.html")&&($file != "index.php")&&($file != "Thumbs.db")) { 
       $strExt = end(explode(".", $file)); 
        if ($strExt == 'jpg') { 
         $Link = 'index.php?option=com_shop&task=deleteFile&file[]='.$file; 
         $thelist .= '<tr class="row0"><td nowrap="nowrap"><a href="'.$Link.'">'.$file.'</a></td>'."\n"; 
         $thelist .= '<td align="center" class="order"><a href="'.$Link.'" title="delete"><img src="/administrator/images/publish_x.png" width="16" height="16" alt="delete"></a></td></tr>'."\n"; 
        } 

       } 
      } 
     } 
     closedir($handle); 
    } 
    echo $thelist; 

:)

回答

14

而不是使用readdir,你可以簡單地使用scandirdocumentation)的。

scandir的返回值是一個數組而不是一個字符串,所以您的代碼將不得不稍微調整,以迭代數組而不是檢查最終的返回值null。此外,scandir採取與目錄路徑,而不是一個文件句柄作爲輸入一個字符串,新版本將是這個樣子:

foreach(scandir($mainframe->getCfg('absolute_path') ."/images/store/") as $file) { 
    // rest of the loop could remain unchanged 
} 
+0

啊,這是真棒作品像一個魅力,非常感謝你:D – SoulieBaby 2009-07-08 01:23:26

+0

找到這個答案,同時試圖解決同樣的確切問題。謝謝!工作得很好,代碼少! – Agos 2010-05-23 22:30:19

+0

這很好。閱讀完文檔後,我甚至可以用`SCANDIR_SORT_DESCENDING`作爲「scandir(...)`的第二個參數來反轉排序順序。在提供的鏈接中也記錄了其他幾個排序常量。 – 2015-04-15 02:30:27

3

該代碼看起來很凌亂。您可以將目錄遍歷邏輯與演示文稿分開。一個更簡潔的版本(在我看來):

<?php 

// Head of page 
$it = new DirectoryIterator($mainframe->getCfg('absolute_path') . '/images/store/')); 

foreach ($it as $file) { 
    if (preg_match('#\.jpe?g$#', $file->getFilename())) 
     $files[] = $file->getFilename(); 
} 
sort($files); 

// Further down 
foreach ($files as $file) 
    // display links to delete file. 
?> 

你甚至都不需要擔心打開或關閉把手,因爲你使用正則表達式檢查文件名,你不需要任何爆炸或有條件的檢查。

2

我喜歡Glob 它使目錄讀一扣,因爲它返回一個數組這是很容易排序:如果您使用Joomla1.5您應該使用定義的常量JPATH_BASE,而不是

<?php 
$files = glob("*.txt"); 
sort($files); 
foreach ($files as $filename) { 
    echo "$filename size " . filesize($filename) . "\n"; 
} 
?> 
1

$mainframe->getCfg('absolute_path') 

如果這是一個Joomla擴展,你會分發,不使用SCANDIR(),因爲它是PHP5只要。

最好的辦法是使用Joomla API。它有一個目錄和文件訪問類,通過不同的網絡和協議進行分層。因此,文件系統可以通過FTP進行傳輸,並且類可以擴展到任何網絡/協議。

jimport('joomla.filesystem.folder'); 
$files = JFolder::files(JPATH_BASE."/images/store/"); 
sort($files); 
foreach($files as $file) { 
    // do your filtering and other task 
} 

您也可以通過正則表達式作爲第二個參數JFolder ::文件()的過濾器,您收到的文件。

您也不希望使用URL文字(如/ administrator /),因爲它們可以更改。 使用JURI方法,如:

JURI :: base();

如果你想確保Joomla的CSS類的表格中,爲:

'<tr class="row0">' 

使用:

'<tr class="row'.($i&1).'">' 

其中$ I是迭代的次數。這給你一個0和1交替的序列。

1

如果我們有PHP內置函數,總是使用它,它們會更快。 使用glob代替遍歷文件夾,如果它適合您的需要。

$ folder_names = array(); $ folder_names = glob('*',GLOB_ONLYDIR + GLOB_MARK + GLOB_NOSORT);

  • 稱之爲 刪除GLOB_ONLYDIR包含文件太前returs在當前目錄下,使用CHDIR()的一切(將只有文件) GLOB_MARK是添加斜線到文件夾名稱 刪除GLOB_NOSORT不排序陣列