2017-09-29 17 views
1

こんにちは私は以下の関数を繰り返し実行しようとしています。それはすべてのディレクトリを捨てて、そこにすべてのファイルを私に渡します。PHP - ディレクトリを再帰的から反復的にブラウズする

function getFilesFromDirectory($directory, &$results = array()){ 
    $files = scandir($directory); 

    foreach($files as $key => $value){ 
     $path = realpath($directory.DIRECTORY_SEPARATOR.$value); 
     if(!is_dir($path)) { 
      $results[] = $path; 
     } else if($value != "." && $value != "..") { 
      getFilesFromDirectory($path, $results); 
      $results[] = $path; 
     } 
    } 
    return $results; 
} 

この機能を反復可能にすることは可能ですが、どうすればこのようにすることができますか。

+1

私はそうは思わない。ディレクトリツリーはツリーです。あなたはあらかじめそれがどれだけ深いか分かりません。 –

+0

確かに可能です、私の答えを見てください。 – JParkinson1991

+0

プッシュ/ポップ操作を再帰的な関数呼び出しからデータ構造に移動する必要はありません。つまり、コードを反復することはできますが(あるコストで)、操作はできません。これで何を達成しようとしていますか? – symcbean

答えて

3

あなたはこれを実装するためにいくつかのPHP基本クラスを使いたいと思っています。 RecursiveIteratorIteratorの内部RecursiveDirectoryIteratorを使用して

あなたは関係なく、どのようにネストされたディレクトリ内のすべてのものを反復することができます。

その価値は各$アイテムの下$イテレータをループする際に注意することは、タイプSplFileInfoをの目的です。このクラス上の情報はここで見つけることができます:http://php.net/manual/en/class.splfileinfo.php

<?php 

//Iterate over a directory and add the filenames of all found children 
function getFilesFromDirectory($directory){ 
    //Return an empty array if the directory could not be found 
    if(!is_dir($directory)){ 
     return array(); 
    } 

    $iterator = new RecursiveIteratorIterator(
     new RecursiveDirectoryIterator($directory) 
    ); 

    $found = array(); 
    foreach($iterator as $item){ 
     if(method_exists($item, 'isFile') && $item->isFile()){ 
      //Uncomment the below to exclude dot files 
      //if(method_exists($item, 'isDot') && $item->isDot()){ 
      // continue; 
      //} 

      //Pathname == full file path 
      $found[] = $item->getPathname(); 
     } 
    } 

    return $found; 
} 

私はテストとして、この機能を使用していたいくつか見つかったファイルののvar_dump:

enter image description here

・ホープ、このことができます!

+0

承認済み!助けてくれてありがとう@ JParkinson1991。 –

関連する問題