【问题标题】:PHP Filesystem PaginationPHP文件系统分页
【发布时间】:2010-05-13 02:44:48
【问题描述】:

如何对文件夹中的大量文件进行分页?

我在 PHP 文档中看不到任何提到任何指定“偏移量”的方法的函数。 glob() 和 scandir() 都只是简单地返回文件夹中的所有文件,恐怕对于一个巨大的目录来说这不是一个好主意。

有没有比简单地检查所有文件并删除前 X 个文件更好的方法?请注意,我希望有递归遍历和使用 glob() 模式的选项。

编辑:我看过很多 LimitIteratorGlobIteratorRecursiveDirectoryIterator。它们看起来都不错,但如果我要将它们组合起来,我什至不知道从哪里开始(PHP SPL 文档非常稀疏)。我可能只是在想这个问题。

【问题讨论】:

  • 多大是多大?您是否完全尝试过 SPL 课程,还是不知道从哪里开始?
  • 目前该文件夹有大约 2000 个图标,因此需要分页。我尝试使用 SPL 迭代器,但文档太少了。我的 PHP 版本也不支持 GlobIterator,所以我想我必须自己编写版本。是扩展现有迭代器之一还是手动实现其中一个接口更好?
  • 您使用的是哪个版本的 PHP?假设熟悉这些(过滤)迭代器是如何工作的,那么编写 GlobIterator 并不难。如果您想在这里来回回想想法,请随意,或者您可以给我发电子邮件(在此处将@php.net 后缀为我的用户名)。

标签: php file filesystems pagination glob


【解决方案1】:

您可以自己对结果进行分页,PHP 返回一个简单的数组,因此您可以保留一个 $offset 和 $limit 变量,以便您知道您在数组的哪一部分。

如果您在网络环境中,您可以在 GET 参数中传递这些参数。

【讨论】:

    【解决方案2】:

    只是为弗朗西斯科·索托所说的添加一些代码,手动分页

    $limit = 10;
    $offset = (isset($_GET['offset'])) ? $_GET['offset'] : 0;
    $dir = scandir($path);
    for ($i = $offset; $i < $offset+$limit; $i++) {
        echo $dir[$i] . "<br />";
    }
    echo "<br />";
    for ($i = 0; $i < count($dir); $i++) {
        echo "<a href='?offset=" . ($i*$limit) . "'>{$i}</a>";
    }
    

    非常粗糙、未经测试的代码。

    【讨论】:

      【解决方案3】:

      不,没有。目录只是另一种类型的流,这就是“seek”运算符的定义方式:

      static int php_plain_files_dirstream_rewind(php_stream *stream, off_t offset, int whence, off_t *newoffs TSRMLS_DC)
      {
          rewinddir((DIR *)stream->abstract);
          return 0;
      }
      

      你看这只是倒带。因此,您必须读取前 n 个条目才能读取条目 n + 1。如果您想提高效率,可以第一次读取整个目录并将其用作缓存(例如存储在会话中)。阅读完所有内容后,您将转到存储数组中的偏移量 n+1。

      【讨论】:

        猜你喜欢
        • 2012-04-19
        • 1970-01-01
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多