ホームページ > バックエンド開発 > PHPチュートリアル > PHP チュートリアル: ディレクトリ内のファイルを再帰的に走査する必要はありません_PHP チュートリアル

PHP チュートリアル: ディレクトリ内のファイルを再帰的に走査する必要はありません_PHP チュートリアル

WBOY
リリース: 2016-07-21 14:58:35
オリジナル
808 人が閲覧しました

特定のディレクトリ内のすべてのファイル (サブディレクトリを含む) を走査したい場合、最初に思い浮かぶのは再帰を使用することです。つまり、最初に現在のディレクトリを処理し、次に現在のディレクトリの下のサブディレクトリを処理します。再帰を使用しないことはできますか? 以前、データ構造を学習していたときに見たことがあります。再帰は実際にはスタックを使用して実装されます。その特徴は、最後の呼び出しが最初に実行され、最後から 2 番目の呼び出しが実行されることです。 is は 2 番目に実行され、以下同様に最初の呼び出しが最後に実行されます。再帰の原理を理解していれば、実際にすべての再帰的実装を非再帰的実装に変換できます。

非再帰的な方法でディレクトリ内のすべてのファイルをスキャンする このアイデアは、主に 3 つのステップに分かれています。

1. 配列を作成し、走査するディレクトリを配置します (実際にはスタックが作成されます)。

2. この配列をループします。ループの終了条件は、配列が空であることです。

3. 各ループで、配列内の要素を処理し、要素がディレクトリの場合は、ディレクトリ内のすべてのサブ要素を配列に追加します。

この考えに従って書かれたコードは次のとおりです:

クリップボードにコピー

引用コンテンツ: [www.bkjia.com] /*** ディレクトリ内のすべてのファイルをスキャンします Liehuo.Net Codes* @param string $dir * bkjia.com から*/
関数 scanAll($dir)
{
$list = array();
$list[] = $dir;

while (count($list) > 0)
{ //配列の最後の要素をポップします
$file = array_pop($list);

//現在のファイルを処理します
echo $file."rn"//ディレクトリの場合
if (is_dir( $file))
{
$children = scandir($file);
foreach ($children として $child)
{
if ($child !== '.' && $child !== '..')
{
$list[ ] = $file.'/'.$child
}
}
}
}
}
実際、多くの場合、再帰を使用した設計は非常に簡潔で読みやすいですが、再帰の深さが特に大きくない限り、影響はありません。

以下は比較のために再帰を使用した実装です:


クリップボードにコピー

引用コンテンツ:

[www.bkjia.com]

/*** ディレクトリ内のすべてのファイルを走査します (再帰的実装) * @param string $dir */ function scanAll2($dir) Liehuo.Net Codes{ echo $dir."rn"
if (is_dir($dir))
{
$children = scandir($dir); ($children を $child として)
{
if ($child !== '.' && $child !== '..')
{
scanAll2($dir.'/'.$child)
}
; }
}
}
// bkjia.com
実行後、2 つの関数の結果は、主に印刷順序において若干異なることがわかります。スタックにプッシュする順序は、scandir が出力される順序とまったく逆であるため、関数 1 の実行結果の順序は逆になります。
行 21 を変更できます。

クリップボードにコピー


引用コンテンツ:
[www.bkjia.com]

$children = array_reverse(scandir($file));

結果はまったく同じになります。 この記事の出典: http://blog.quanhz.com/archives/210 Liehuo.Net Codeshttp://www.bkjia.com/PHPjc/363828.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/363828.html

ディレクトリ (サブディレクトリを含む) 内のすべてのファイルを走査したい場合、最初に思い浮かぶのは再帰を使用することです。つまり、最初に現在のディレクトリを処理し、次に現在のディレクトリの下のサブディレクトリを処理します。再帰する必要はありません...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート