递归函数中的变量表现为全局变量

时间:2011-12-02 06:30:18

标签: php global-variables

我有一个递归函数,应该打印目录的内容。这是代码

function dirs($dir, $tab) {
    $d = opendir($dir);
        while ( ($name = readdir($d)) !== false ) {
            if ( $name == "." or $name == ".." ) continue;
            if ( is_dir($dir . '/' . $name) ) {
                echo "<b>" . $tab . "[$name]</b><br>";
                $tab .= "-";
                dirs($dir . '/' . $name, $tab);
            }
            else {
                echo $tab . $name . '<br>';
            }
        }
        closedir($d);
}
dirs("C:/php5", "");

这个函数的输出就像那样([extras]是空的直接):

[dev]
-php5ts.lib
-[ext]
--php_bz2.dll
--php_curl.dll
--php_enchant.dll
--php_exif.dll
--etc.
--[extras]
---glib-2.dll
---gmodule-2.dll
---icudt.dll
---icudt46.dll
---icuin.dll
---etc.

但不喜欢

[dev]
-php5ts.lib
[ext]
-php_bz2.dll
-php_curl.dll
-php_enchant.dll
-php_exif.dll
-etc.
[extras]
glib-2.dll
gmodule-2.dll
icudt.dll
icudt46.dll
etc.

问题是为什么“$ tab”表现为全局变量而不是本地变量?

提前致谢。

2 个答案:

答案 0 :(得分:2)

问题是您实际上正在重新分配$tab的本地副本的值,而您实际想要做的是将$tab.'.'传递给下一次迭代。

因为您已经重新分配了它,所以在内部迭代执行后,它将继续在外部迭代中拥有新值。

变化:

$tab .= "-";
dirs($dir . '/' . $name, $tab);

简单地说:

dirs($dir . '/' . $name, $tab . '-');

答案 1 :(得分:0)

您将$ tab传递给该函数,并且没有任何内容可以重新初始化$ tab,因此每次通过它时都会选择一个新的“ - ”。

每次完成目录内容时都需要删除“ - ”。

我建议您使用整数跟踪水平,而不是添加“ - ”,并使用整数来添加所需的“ - ”数。


报废。 DaveRandom的答案要容易得多。