実装方法: 1. 配列を作成し、走査するディレクトリを配置します; 2. 配列を処理するループ。ループの終了条件は配列が空であることです。3. 各ループ、配列要素の 1 つを処理し、その要素を削除します; 4. この要素がディレクトリの場合、ディレクトリ内のすべてのサブ要素を配列に追加し、配列が空になるまで要素を処理します。
このチュートリアルの動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター
ディレクトリ内のすべてのファイル (サブディレクトリを含む) について、最初に思い浮かぶのは再帰を使用することです。最初に現在のディレクトリを処理し、次に現在のディレクトリの下のサブディレクトリを処理します。再帰なしでも可能でしょうか?データ構造を勉強していたときに見たことがありますが、再帰は実際にはスタックを使って実装されています。再帰の特徴は、自分自身を継続的に呼び出し続けることです。最後の呼び出しが最初に実行され、最後から 2 番目の呼び出しが 2 番目に実行されます。最初の呼び出しが最後に実行されます。再帰の原理を理解していれば、実際にすべての再帰実装を非再帰実装に変換できます。
# 非再帰的な方法を使用して、ディレクトリ内のすべてのファイルを走査します。このアイデアは、主に次の手順に分かれています。 #配列を作成し、走査するディレクトリを配置します (実際にはスタックが作成されます)
ループします。この配列を処理し、ループ 終了条件は配列が空であることです;
# 各ループは配列内の要素を処理し、要素を削除します;
この要素がディレクトリの場合、ディレクトリ内のすべてのサブ要素を配列に追加し、配列が空になるまで要素を処理します。
この考え方に従って書かれたコードは次のとおりです。
<?php /** * 遍历某个目录下的所有文件 * @param string $dir */ function scanAll($dir) { $list = array(); $list[] = $dir; while (count($list) > 0) { //弹出数组最后一个元素 $file = array_pop($list); //处理当前文件 echo $file."\r\n"; //如果是目录 if (is_dir($file)) { $children = scandir($file); foreach ($children as $child) { if ($child !== '.' && $child !== '..') { $list[] = $file.'/'.$child; } } } } } ?>ここで私は再帰には大きな欠点はないと思います。実際、多くの場合、再帰を使用して設計すると非常に簡潔で読みやすくなります。効率の問題に関しては、再帰の深さが特に大きくない限り、影響はありません。
比較のための再帰実装は次のとおりです:
<?php /** * 遍历某个目录下的所有文件(递归实现) * @param string $dir */ function scanAll2($dir) { echo $dir."\r\n"; if (is_dir($dir)) { $children = scandir($dir); foreach ($children as $child) { if ($child !== '.' && $child !== '..') { scanAll2($dir.'/'.$child); } } } } ?>2 つの関数の結果が一致することがわかります。主に印刷順に違いがあります。スタックにプッシュする順序が scandir が出力される順序とまったく逆であるため、関数 1 の実行結果の順序が逆になります。21 行目を変更できます:
$children = array_reverse(scandir($file));推奨調査: "
PHP ビデオ チュートリアル 》
以上が再帰なしでPHPのディレクトリ内のすべてのファイルを走査する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。