PHP(文件夹)文件列表按字母顺序排列?

时间:2009-07-08 01:07:30

标签: php file directory alphabetized

我不确定这会有多简单,但是我使用的是一个显示特定文件夹中文件的脚本,但是我希望它们按字母顺序显示,是否很难做到这一点?这是我正在使用的代码:

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;

:)

5 个答案:

答案 0 :(得分:14)

您可以简单地使用readdirdocumentation)来默认按字母顺序排序,而不是使用scandir

scandir的返回值是一个数组而不是字符串,因此您的代码必须稍微调整一下,以迭代数组而不是检查最终的null返回值。此外,scandir采用带有目录路径而不是文件句柄的字符串作为输入,新版本看起来像这样:

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

答案 1 :(得分: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 :(得分:2)

我喜欢Glob 它使目录读取成为一个快照,因为它返回一个易于排序的数组:

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

答案 3 :(得分:1)

如果你正在使用Joomla1.5,你应该使用定义的常量 JPATH_BASE 而不是

$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 :: files(),以过滤您收到的文件。

您也不想使用像/ administrator /这样的URL文字,因为它们可以更改。 使用JURI方法,如:

JURI ::基();

如果要确保表中的Joomla CSS类,请执行以下操作:

'<tr class="row0">'

使用:

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

其中 $ i 是迭代次数。这给出了一系列交替的0和1。

答案 4 :(得分:1)

如果我们有PHP内置函数,总是使用它,它们更快。 如果符合您的需要,请使用glob而不是遍历文件夹。

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

  • 在当前目录中重写所有内容,在调用它之前使用chdir() 删除GLOB_ONLYDIR也包含文件(只是文件) GLOB_MARK用于向文件夹名称添加斜杠 删除GLOB_NOSORT不对数组进行排序