ホームページ  >  記事  >  バックエンド開発  >  PHP5 の DirectoryIterators を使用してインデックスを再帰的にスキャンする

PHP5 の DirectoryIterators を使用してインデックスを再帰的にスキャンする

WBOY
WBOYオリジナル
2016-06-13 11:58:33834ブラウズ

PHP5 の DirectoryIterators を使用してディレクトリを再帰的にスキャンする

具体的: http://www.verydemo.com/demo_c116_i81977.html

PHP5 Iterator で追加は、階層データ構造の移動と操作に役立つ既製のインターフェイスのセットで、PHP5 の最も興味深い新機能の 1 つです。

これらのイテレーターは、XML ドキュメント ツリーまたはファイルのコレクションの処理に必要なコードを大幅に削減します。 PHP5 では、ArrayIterator、CachingIterator、LimitIterator、RecursiveIterator、SimpleXMLIterator、DirectoryIterator など、多数のイテレータが使用されます。

ディレクトリ内のファイルは、DirectoryIterator を通じて迅速かつ効率的に処理できます。コーディング プロセスにもう少し創造性を加えると、DirectoryIterator を使用して、ネストされたディレクトリ ツリーを再帰的に処理することもできます。どちらのタスクも、わずか数行のコードを使用して実行でき、「標準」アプローチに比べて大幅に改善されています。

単一レベルのディレクトリの処理

まず、単一レベルのディレクトリを処理するという単純なタスクから始めます。次のコード (リスト A) を入力 (またはコピー) し、ローカル構成を反映するようにディレクトリ パスを変更します。

リスト A

<?php<code><?php<br>$it = new DirectoryIterator("/tmp/mystuff");<br>foreach($it as $file) {<br>if (!$it->isDot()) {<br>echo $file . "n";<br>}<br>}<br>?>$it = new DirectoryIterator( "/tmp /mystuff");

foreach($it as $file) {

if (!$it->isDot()) {

echo "n";

}

}

?>

このコードの出力をブラウザで表示すると、指定したディレクトリ内のファイルのリストが表示されます。どうしてこんなことになったのでしょうか? DirectoryIterator は、ディレクトリの内容を再記述するための所定のインターフェイスを提供します。ターゲット ディレクトリの場所がサンプリングされると、各要素がディレクトリ内のファイルを表す標準的な PHP 配列として扱うことができます。 isDot () メソッドを使用して「.」ディレクトリと「..」ディレクトリをそれぞれ除外することに注意してください。

ネストされたディレクトリ ツリーの処理<?php<br>$it = new RecursiveDirectoryIterator("/tmp");<br>foreach(new RecursiveIteratorIterator($it) as $file) {<br>echo $file . "n";<br>}<br>?> ネストされたディレクトリ ツリーを再帰的に処理することも、ほぼ同じくらい簡単です。この場合、DirectoryIterator は、単一レベルのディレクトリ内で見つかったすべてのオブジェクトをチェックして、それがファイルであるかディレクトリであるかを判断する必要があります。ディレクトリの場合は、1 つ下のレベルに移動して、次のレベルの内容を確認します。これは非常に複雑に聞こえるかもしれませんが、以前は通常 15 行を超えるコードが必要でした。

ただし、PHP5 では、上記の関数をすべて組み合わせた RecursiveIterator と RecursiveIteratorIterator という 2 つの新しいイテレーターだけが必要です。リスト B を参照してください:

リスト B

<?php</p>$it = new RecursiveDirectoryIterator("/tmp");<p>foreach(new RecursiveIteratorIterator($it) as $ file) {</p>echo $file . "n";<code><?php<br>$it = new DirectoryTreeIterator("/tmp/cookbook/");<br>foreach($it as $path) {<br>echo $path . "n";<br>}<br>?>}

?>

....... ................................................|-ch01<br>| |-recipe01<br>| | |-example01.php<br>| | -example02.php<br>| |-recipe02<br>| | |-example01.php<br>| | -example02.php<br>| |-recipe03<br>| | -example01.php<br>...実際のアプリケーション: ディレクトリ ツリーの印刷

グラフィカルなディレクトリ ツリーの印刷は、ディレクトリ再帰の一般的なアプリケーションです。 Iterator クラスのドキュメントには、このアプリケーション専用に作成されたインスタンス クラスが含まれているため、Iterator を使用してこのタスクを処理するのは非常に簡単です。 DirectoryTreeIterator (Marcus Boerger のおかげ) は、前述した RecursiveIteratorIterator にその他の改良点を提供します。特に、ツリー構造内の深さと位置を表す ASCII タグが挙げられます。

リスト C は、DirectoryTreeIterator の使用法を示しています。
List C<?php<🎜>$it = new DirectoryTreeIterator("/tmp/cookbook/");<🎜>foreach($it as $path) {<🎜 >echo $path . "n";<🎜>}<🎜>?> 以下は、表示される出力の一部です。 | -recipe01 | -example02.php | .. これらの DirectoryIterators の値をより深く理解するには、このチュートリアルで説明されている 3 つの標準のファイル関数とディレクトリ関数を使用してみてください。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。