PHP案例切换行为打破了递归scandir函数

时间:2012-11-19 22:42:13

标签: php switch-statement

在我寻求一些基本的PHP知识的过程中,我试图做一个简单的函数来读取不使用递归迭代器的文件和目录。 (更多的练习但实际上需要任何php< 5.3服务器)

该功能效果很好 - 但是当我尝试添加switch($输出)时 - 它不再列出所有文件(例如,在添加开关之前,它可以看到4个文件夹中的61个文件( 3 + root)但添加了switch它只能看到47(只有root)。 我在这里做错了吗?为什么switch语句打破了虚假的“recursive-nest”??

    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; 
            }

} 

有没有其他简单的方法让函数返回dirs AND文件的单独列表而不是统一数组?

2 个答案:

答案 0 :(得分:1)

因为在这一行......

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

...你没有给递归调用的函数$output,所以它不会输出任何东西。将其更改为:

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

实际上你应该对失踪的争论发出警告。

答案 1 :(得分:1)

您似乎无法在任何地方设置$output

BTW:出于学习目的,我强烈建议将error_reporting(E_ALL);添加为脚本的第一行并重新运行(首先,不修复任何内容),因为您应该看到警告,因为第二个函数参数不是可选的。你有签名

function o99_list_my_files_scandir($dir,$output) 

但请致电

o99_list_my_files_scandir("$dir/$value")

你应该

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

foreach()