1

我正在尝试构建一个递归函数,但以某种方式函数不会显示所有目录。我错过了什么?我知道我可以使用 for 或 while,但我想要 foreach 循环。这是代码:

$GLOBALS['testmodus']=0;
$o=new BrowseFolder();
$o->browse('../images/',1);
ta($o);
function ta($ausgabe) {
  echo('<p class="ta">'.__LINE__.$ausgabe.'</p>');
 }


class BrowseFolder{
    private $srcFolder;
    private $ifRecursiv=0;
    private $excludeFileTypes=array('.','..');
    private $filesFound;
    private $deleteFolderPath=0;
    private $makeFolderPath;

    public function browse($srcFolder,$ifRecursiv=0){
        ta($this->filesFound);
        $this->srcFolder=$srcFolder;
        $this->ifRecursiv=$ifRecursiv;
        $this->filesFound=scandir($this->srcFolder);
        $this->filesFound=$this->excludeArrayFromArray($this->filesFound,$this->excludeFileTypes);
        echo "<ul>";
        foreach($this->filesFound as $val){
                if(is_file($this->srcFolder.$val)){
                    echo "<li>";
                    echo "$val";
                    echo "</li>";
                    }elseif(is_dir($this->srcFolder.$val) && $this->ifRecursiv==1){
                        ta($this->srcFolder.$val);
                        echo "$val";
                        $this->browse($this->srcFolder.$val.'/',$this->ifRecursiv);

                      }
        }
        echo "</ul>";
    }

    private function excludeArrayFromArray($baseArray,$arrayToExclude){  //Exclude an array from another array,and arrange
        $newArray=array_values(array_diff($baseArray,$arrayToExclude));  
        return $newArray;

    }
}
4

1 回答 1

1

我猜如果你查看 web 服务器日志,你会看到这个错误:

PHP Catchable fatal error:  Object of class BrowseFolder could not be converted to string in <filename> on line <XX>

您的BrowseFolder类没有__toString()方法,因此尝试在字符串上下文中调用它会引发致命错误(这一行ta($o);:)

但是,这只是问题 1。问题 2 是这样的:

$this->srcFolder=$srcFolder;

由于您的 BrowseFolder 类只有一个实例,因此您要在该类上设置一个属性,然后尝试在递归中重用它。所以基本上它正在做的是钻入第一个文件夹,然后因为$this->srcFolder只是等于它的后续子级,所以它没有尝试更进一步。将 的每个实例替换$this->srcFolder$srcFolder。然后递归函数将深入到第一个,然后当它到达末尾时,返回到第一次调用browse(),然后继续到第二个,依此类推。

编辑- 附加细节:它不应该每次都修改变量。它所做的是获取第一个文件夹images,然后在类上设置该属性。它进入该文件夹的第一个子文件夹 - 调用它folder1,然后再次将类属性设置为该子文件夹(即$this->srcFolder == "images/folder1")。它列出了该文件夹中的文件,然后继续。由于该文件夹中没有更多文件或子目录,因此该迭代已结束。然后它会回到images文件夹的一个级别。它进入foreach循环的下一次迭代,现在设置$valfolder2. 现在它同时尝试if(is_file($this->srcFolder.$val))else if (is_dir($this->srcFolder.$val)。那的翻译是is_file("images/folder1/folder2")因为$this->srcFolder等于images/folder1。结果,这总是返回false直到它到达终点foreach并退出。

如果您改为调用$srcFolder(局部变量),那么每次到达函数时它都会具有正确的值。在相同的场景中:它进入函数folder1的第二层, . 它列出了该文件夹的每个元素,然后返回到. 现在函数仍然有它的初始值,即。那么在循环的第二次迭代中,现在又是 equals ,所以它会调用它。再次在函数的第二级中,。在递归中使用局部变量可确保函数的每次调用都具有所需的值。browse()$srcFolder == "images/folder1"images$srcFolder"images"foreach$valfolder2browse()$srcFolder == "images/folder2"

于 2013-10-20T21:22:17.927 回答