2011-12-02 76 views
1

我有一个应该打印目录内容的递归函数。下面是代码递归函数中的变量表现为全局函数

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", ""); 

该函数的输出贵方觉得这样的([额外]是空的directoty):

[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

$ tab =。 “ - ”;是无效的语法... – sirbrialliance

+0

对不起朋友。我不太明白这个问题? – stefgosselin

+0

对不起,$ tab。=“ - ”; (已更改) – Placido

回答

2

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

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

变化:

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

简单:

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

谢谢,现在很清楚。 – Placido

0

你传递$标签的功能,并没有什么重新初始化$标签,所以每一次经过它拾起新的“ - ”。

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

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


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