0

我有一个包含大约 100 个子目录的目录(嵌套,大约 3-4 深)。我需要一个小的 PHP 脚本,它将简单地输出 11 个最近添加(或修改,因为它们都是 pdf 文件)文件的列表,每个文件<br />之间都有一个简单的文件,每个文件都链接到它们的 URL。

我发现了一些可以执行 1 或全部的脚本,但不知道如何开始专门限制为 11,或者如何应用确切的 href。

我的另一个担忧是该脚本的服务器使用情况,因为它将被放置在一个使用率较低的登录页面上,但是每个用户都会看到它。

任何关于资源的想法或开始的地方,将不胜感激!

4

4 回答 4

3

未经测试,但它应该可以工作:

<?php

function getFiles($dir)
{
    $arr=scandir($dir);
    $res=array();
    foreach ($arr as $item)
    {
        if ($item=='..' || $item=='.'){continue;}
        $path=$dir.'/'.$item;
        if (is_dir($path))
        {
            $res=array_merge($res,getFiles($path));
        }
        else
        {
            $res[$path]=filemtime($path);
        }
    }
    return $res;
}

$files=getFiles('directory');
arsort($files);
$files=array_slice(array_keys($files),0,11);
foreach ($files as $file)
{
    echo '<a href="'.$file.'">'.$file.'</a><br />';
}
?>
于 2012-06-11T17:38:35.690 回答
1

提供一个基于网络的上传界面会更有意义。这样您就可以跟踪每个新的上传。

  • 用户选择类别(每个类别/子类别映射到一个文件夹)
  • 上传文件到服务器
  • 脚本转储表格行中的每个文件名、位置和日期

完毕。要获取最新的 11 个文件(在整个系统或特定类别/文件夹中),您只需要查询数据库。

如果您的用户也需要删除文件的能力,只需为该功能添加 Web 界面即可。而不是删除文件,只需在表中将它们标记为“隐藏”即可。

除了解决眼前的问题外,它还将为审核、所有权归属和搜索提供额外的可能性......等等。

于 2012-06-11T18:05:10.047 回答
0

使用递归迭代器。这就是它的设计目的。我添加了一个名为 sortedIterator 的额外迭代器,它扩展了 SPLHeap,以按 getMTim​​e() 排序,这是 dir 的修改时间。

将 $path 更改为目录的完整路径。

$path = '.';

class sortedIterator extends SplHeap
{
    public function __construct(Iterator $iterator)
    {
        foreach ($iterator as $item) {
            $this->insert($item);
        }
    }
    public function compare($b,$a)
    {
        return strcmp($a->getMTime(), $b->getMTime());
    }
}

    $recursive = new RecursiveDirectoryIterator($path);
$sortByTime = new sortedIterator($recursive);
$i = 0;
foreach ($sortByTime as $file) {
        if($file->isDir()){
                $dirs[] = $file->getFilename();

                if($i++ == 9){
                        break;
                }
        }
}

print_r(implode("<br />", $dirs));

编辑,如果您想要创建时间,请将 getMTim​​e 更改为 getCTime。

于 2012-06-11T18:13:54.553 回答
-1

使用列出所有这些的代码,但在输出之前使用usort调用通过减少修改时间对文件进行排序。然后,你的循环应该从这个开始:

$l = count($fileArray);
for( $i=0; $i<11 && $i<$l; $i++) {
    // output file entry
}
于 2012-06-11T17:32:04.790 回答