2011-12-02 87 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的答案要容易得多。