我不确定这会有多简单,但是我使用的是一个显示特定文件夹中文件的脚本,但是我希望它们按字母顺序显示,是否很难做到这一点?这是我正在使用的代码:
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;
:)
答案 0 :(得分:14)
您可以简单地使用readdir
(documentation)来默认按字母顺序排序,而不是使用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);