7

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

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;

:)

4

5 回答 5

15

而不是使用readdir你可以简单地使用scandir文档)默认按字母顺序排序。

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

foreach(scandir($mainframe->getCfg( 'absolute_path' ) ."/images/store/") as $file) {
  // rest of the loop could remain unchanged
}
于 2009-07-08T01:12:59.167 回答
4

这段代码看起来很乱。您可以将目录遍历逻辑与演示文稿分开。一个更简洁的版本(在我看来):

<?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.
?>

您甚至不需要担心打开或关闭句柄,而且由于您使用正则表达式检查文件名,因此您不需要任何爆炸或条件检查。

于 2009-07-08T01:46:08.240 回答
2

我喜欢Glob 它使目录读取变得轻而易举,因为它返回了一个易于排序的数组:

<?php
$files = glob("*.txt");
sort($files);
foreach ($files as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}
?>
于 2009-07-08T05:26:11.960 回答
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::base();

如果您想确定表格中的 Joomla CSS 类,对于:

'<tr class="row0">'

采用:

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

其中$i是迭代次数。这为您提供了一系列交替的 0 和 1。

于 2009-07-08T07:19:14.650 回答
1

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

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

  • 返回当前目录中的所有内容,在调用它之前使用 chdir() 删除 GLOB_ONLYDIR 以包含文件(.将只是文件) GLOB_MARK 用于在文件夹名称中添加斜杠删除 GLOB_NOSORT 不对数组进行排序
于 2009-07-08T09:46:49.220 回答