2009-07-08 131 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不排序阵列