PHP(文件夹)按字母顺序排列的文件列表?
我不知道这是多么简单,但我使用的脚本显示来自特定文件夹的文件,但是我希望它们按字母顺序显示,难以做到这一点吗?下面是我使用的代码:它默认的字母顺序排列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;
:)
而不是使用readdir
,你可以简单地使用scandir
(documentation)的。
scandir
的返回值是一个数组而不是一个字符串,所以您的代码将不得不稍微调整,以迭代数组而不是检查最终的返回值null
。此外,scandir
采取与目录路径,而不是一个文件句柄作为输入一个字符串,新版本将是这个样子:
foreach(scandir($mainframe->getCfg('absolute_path') ."/images/store/") as $file) {
// rest of the loop could remain unchanged
}
该代码看起来很凌乱。您可以将目录遍历逻辑与演示文稿分开。一个更简洁的版本(在我看来):
<?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.
?>
你甚至都不需要担心打开或关闭把手,因为你使用正则表达式检查文件名,你不需要任何爆炸或有条件的检查。
我喜欢Glob 它使目录读一扣,因为它返回一个数组这是很容易排序:如果您使用Joomla1.5您应该使用定义的常量JPATH_BASE,而不是
<?php
$files = glob("*.txt");
sort($files);
foreach ($files as $filename) {
echo "$filename size " . filesize($filename) . "\n";
}
?>
$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交替的序列。
如果我们有PHP内置函数,总是使用它,它们会更快。 使用glob代替遍历文件夹,如果它适合您的需要。
$ folder_names = array(); $ folder_names = glob('*',GLOB_ONLYDIR + GLOB_MARK + GLOB_NOSORT);
- 称之为 删除GLOB_ONLYDIR包含文件太前returs在当前目录下,使用CHDIR()的一切(。将只有文件) GLOB_MARK是添加斜线到文件夹名称 删除GLOB_NOSORT不排序阵列
啊,这是真棒作品像一个魅力,非常感谢你:D – SoulieBaby 2009-07-08 01:23:26
找到这个答案,同时试图解决同样的确切问题。谢谢!工作得很好,代码少! – Agos 2010-05-23 22:30:19
这很好。阅读完文档后,我甚至可以用`SCANDIR_SORT_DESCENDING`作为“scandir(...)`的第二个参数来反转排序顺序。在提供的链接中也记录了其他几个排序常量。 – 2015-04-15 02:30:27