我有一个递归函数,它应该打印目录的内容。下面是代码
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"表现为全局变量而不是局部变量?
问题是,您实际上是重新分配$tab
的本地副本的值,而您实际上想要做的是将$tab.'.'
传递给下一次迭代。
因为你已经重新赋值了它,所以在内部迭代执行后,它将继续在外部迭代中拥有新的值。
改变:
$tab .= "-";
dirs($dir . '/' . $name, $tab);
:
dirs($dir . '/' . $name, $tab . '-');
您将$tab传递给函数,并且没有什么可以重新初始化$tab,因此每次它遍历它都会拾取一个新的"-"。
每次完成目录的内容时都需要删除"-"。
不要添加"-",我建议您使用整数跟踪级别,并使用整数添加所需数量的"-"。
废。