2

フォルダー内のファイルの大きなリストをどのようにページ付けしますか?

「オフセット」を指定する方法について言及している関数が PHP ドキュメントにありません。glob() と scandir() はどちらも単純にフォルダー内のすべてのファイルを返しますが、これは巨大なディレクトリには適していません。

単純にすべてのファイルを調べて、最初の X 個のファイルを切り捨てるよりも、これを行うためのより良い方法はありますか? 再帰トラバーサルと glob() パターンを使用するためのオプションが必要であることに注意してください。

編集: LimitIteratorGlobIteratorRecursiveDirectoryIteratorをよく見ました。それらはすべて素晴らしいように見えますが、それらを組み合わせるとしたら、どこから始めればよいかわかりません (PHP SPL のドキュメントは非常にまばらです)。私はおそらく問題を考えすぎているだけです。

4

3 に答える 3

2

いいえ、ありません。ディレクトリは単なる別のタイプのストリームであり、これが「シーク」演算子の定義方法です。

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 + 1 を読み取るには、最初の n エントリを読み取る必要があります。より効率的にしたい場合は、最初にディレクトリ全体を読み取って、それをキャッシュとして使用できます (たとえば、セッションに保存します)。すべてを読み取ったら、格納された配列のオフセット n+1 に移動します。

于 2010-05-13T03:20:58.257 に答える
2

結果を自分でページ付けすることができます。PHP は単純な配列を返すため、$offset 変数と $limit 変数を保持して、配列のどの部分にいるかを知ることができます。

Web コンテキストにいる場合は、これらを GET パラメーターで渡すことができます。

于 2010-05-13T02:52:48.750 に答える
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>";
}

非常にラフでテストされていないコード。

于 2010-05-13T03:11:52.140 に答える