0

PHP の基本的な知識を求めて、再帰イテレータを使用しないファイルとディレクトリを読み取る簡単な関数を実行しようとしました。(より多くの演習ですが、実際にはphp<5.3サーバーに必要です)

関数はうまく機能します-しかし、switch($ output)を追加しようとすると、すべてのファイルがリストされなくなります(たとえば、スイッチを追加する前に、4つのフォルダー(3 +ルート)に61個のファイルが表示されますが、追加されたswitch47 (root のみ) しか見えない . ここで何か間違ったことをしているのだろうか? なぜこのswitchステートメントは偽の「再帰の入れ子」を壊してしまうのだろうか??

    function o99_list_my_files_scandir($dir,$output) 
    { 

        $result = $result2 = array(); 

        $root = scandir($dir); 

        foreach($root as $value) 
        { 

          if($value === '.' || $value === '..' || $value == 'Thumb.db' || $value == 'Thumbs.db' || $value == '') { continue;} 

            if(is_file("$dir/$value")) {$result[]="$dir/$value"; continue;} // array files
            if(is_dir("$dir/$value")) {$result2[]="$dir/$value"; continue;} // array dirs

            foreach(o99_list_my_files_scandir("$dir/$value") as $value) 

            { 
                $result[] = $value; 
            }
        } 
            // this is the troublemaker ...

            switch ($output) {
                case 'dirs' :
                return array_filter($result2);  // clean empty results of dirs
                break;

                case 'files' :
                return array_filter($result);   // Clean empty array of files
                break; 
            }

} 

統合された配列ではなく、ディレクトリとファイルの個別のリストを返す関数を取得する他の簡単な方法はありますか?

4

2 に答える 2

1

$outputあなたはどこにも設定していないようです。

ところで: 学習目的error_reporting(E_ALL);で、スクリプトの最初の行として追加して再実行することを強くお勧めします (最初は何も修正せずに)。2 番目の関数パラメーターはオプションではないため、警告が表示されるはずです。サインいただきました

function o99_list_my_files_scandir($dir,$output) 

しかし電話する

o99_list_my_files_scandir("$dir/$value")

あなたがしなければならない間

o99_list_my_files_scandir("$dir/$value", $output)

あなたのforeach()

于 2012-11-19T22:50:23.833 に答える
1

だってこの列に…

foreach(o99_list_my_files_scandir("$dir/$value") as $value)

...$output再帰的に呼び出された関数に渡さないため、何も出力されません。次のように変更します。

foreach(o99_list_my_files_scandir("$dir/$value", $output) as $value)

実際には、欠落している引数に関する警告が表示されているはずです。

于 2012-11-19T22:50:05.380 に答える