0

再帰的なフォルダー内のファイルの配列を返す関数があります。

protected function getFiles($base) {

    $files = array();       
    if(!is_dir($base)) return $files;

    if (($handle = opendir($base)) != false) {
        while (false !== ($file = readdir($handle))) {
            if ($file == "." || $file == "..") continue;

            if(is_dir("$base/$file")) {                 
                $subfiles = $this->getFiles("$base/$file");
                $files = array_merge($files, $subfiles);                    
            } else {                    
                if(File::type($file,false) == "xml") 
                    $files[] = "$base/$file";
            }
        }
        closedir($handle);
    }

    return $files;
}

サブフォルダーの前に常にルートファイルを最初にリストするように、これを変更するにはどうすればよいですか? 現時点では、デフォルトでフォルダが常に最初に来ます。

4

3 に答える 3

1

PHPSPLDirectoryIteratorクラスを確認することをお勧めします。オブジェクトをインスタンス化してから、すばやく反復処理して、ディレクトリ、ファイル、リンクをセグメント化し、それぞれの完全なSplFileInfoオブジェクトを取得できます(これにより、ファイルに関する必要な情報を非常に簡単に取得できます)。

$directory = '/path/to/directory';
$iterator = new DirectoryIterator($directory);
$dirs = array();
$files = array();
$links = array();

foreach($iterator as $obj) {
    if($obj->isFile()) {
        $files[] = $obj;
    } else if ($obj->isDir()) {
        $dirs[] = $obj;
    } else if ($obj->isLink()) {
        $links[] = $obj;
    }
}

申し訳ありませんが、再帰的に実行したいと思ったことに気づきました。そのためにはRecursiveDirectoryIteratorを使用しますが、概念はほとんど同じです。

于 2012-07-26T19:16:30.517 に答える
0

ディレクトリポインタをループしている間にサブディレクトリの配列を作成し、最後にディレクトリの配列を繰り返します。

protected function getFiles($base) {

    $files = $dirs = array();       
    if(!is_dir($base)) return $files;

    if (($handle = opendir($base)) != false) {

        while (false !== ($file = readdir($handle))) {
            if ($file == "." || $file == "..") continue;

            if(is_dir("$base/$file")) {    
                $dirs[] = "$base/$file";
            } else {                    
                if(File::type($file,false) == "xml") 
                    $files[] = "$base/$file";
            }
        }
        closedir($handle);

        foreach ($dirs as $dir) {
            $subfiles = $this->getFiles($dir);
            $files = array_merge($files, $subfiles);                    
        }

    }

    return $files;
}
于 2012-07-26T19:10:35.683 に答える
0

現在のフォルダー内のファイル用とサブフォルダー内のファイル用の 2 つの配列を使用して、それらをマージします。

protected function getFiles($base) {

    $files = array();       
    $subFiles = array();        
    if(!is_dir($base)) return $files;

    if (($handle = opendir($base)) != false) {
        while (false !== ($file = readdir($handle))) {
            if ($file == "." || $file == "..") continue;

            if(is_dir("$base/$file")) {                 
                $subFiles = array_merge($subFiles, $this->getFiles("$base/$file"));                 
            } else {                    
                if(File::type($file,false) == "xml") 
                    $files[] = "$base/$file";
            }
        }
        closedir($handle);
    }

    return array_merge($files, $subFiles);
}
于 2012-07-26T19:11:33.710 に答える