function foreach_dir($filename,$dir){ if(!is_dir($filename)) return; $r = opendir($filename); while($s = readdir($r)){ if($s != '.' && $s != '..'){ echo $s.'
'; // $dir .= $s.'
'; foreach_dir($filename.'/'.$s,$dir); } } return $dir;}echo foreach_dir('templates','');
輸出正確
default
images
index.html
top.jpg
menu
document.gif
documents.gif
index.html
sdocument.gif
sdocuments.gif
stylesheet.css
template.htm
subsilverlike
如果換成這樣
function foreach_dir($filename,$dir){ // $dir = ''; // echo $filename; if(!is_dir($filename)) return; $r = opendir($filename); while($s = readdir($r)){ if($s != '.' && $s != '..'){ // echo $s.'
'; $dir .= $s.'
'; foreach_dir($filename.'/'.$s,$dir); } } return $dir;}echo foreach_dir('templates','');
輸出
default
subsilverlike
我這是把 echo $s.'
';換成了$dir .= $s.'
';顯示路徑就不完全了,哪裡錯了?
回複內容:
function foreach_dir($filename,$dir){ if(!is_dir($filename)) return; $r = opendir($filename); while($s = readdir($r)){ if($s != '.' && $s != '..'){ echo $s.'
'; // $dir .= $s.'
'; foreach_dir($filename.'/'.$s,$dir); } } return $dir;}echo foreach_dir('templates','');
輸出正確
default
images
index.html
top.jpg
menu
document.gif
documents.gif
index.html
sdocument.gif
sdocuments.gif
stylesheet.css
template.htm
subsilverlike
如果換成這樣
function foreach_dir($filename,$dir){ // $dir = ''; // echo $filename; if(!is_dir($filename)) return; $r = opendir($filename); while($s = readdir($r)){ if($s != '.' && $s != '..'){ // echo $s.'
'; $dir .= $s.'
'; foreach_dir($filename.'/'.$s,$dir); } } return $dir;}echo foreach_dir('templates','');
輸出
default
subsilverlike
我這是把 echo $s.'
';換成了$dir .= $s.'
';顯示路徑就不完全了,哪裡錯了?
你熟讀一下你程式的邏輯就知道了,雖然你在迴圈中把$dir
傳遞到了foreach_dir
中進行遞迴,但是你沒有擷取和處理foreach_dir
返回的$dir
,所以最後你得到的也就是根目錄和其下一級檔案,沒有更進的目錄了。
程式應該是這樣的
function foreach_dir($filename, $dir){ if(!is_dir($filename)) return ''; $r = opendir($filename); while ($s = readdir($r)) { if($s != '.' && $s != '..') { $dir .= $s.'
'; $dir .= foreach_dir($filename . '/' . $s, $dir); } } return $dir;}echo foreach_dir('templates','');
因為你把echo都注掉了,default和subsilverlike應該都是templates目錄下的第一級子目錄,是由語句$dir .= $s.'
'拼接出來了,實際上除了第一次調用函數外沒有任何內容被列印,所以就是這個結果了。你可以把你的第二段代碼的最後幾句修改成:
echo $dir;}foreach_dir('templates','');
應該就能看到更多結果了。
不過兩段代碼的邏輯都很不清楚,我寫一段你看一下能明白不。
$details = [];function eachDir($dir, &$results) { if (! is_dir($dir)) return false; //不是目錄就不需要處理了 $hd = opendir($dir); while($file = readdir($hd)) { if ($file == '.' || $file == '..') continue; //忽略這兩個目錄 $file = $dir . '/' . $file; //拼接完整的檔案名稱或路徑名 $results[] = $file; //放到遍曆結果中 if (is_dir($file)) eachDir($file, $results); //如果是目錄,遞迴處理 } return true;}eachDir('templates', $details); //$details是通過傳址的方式處理的print_r($details);/** * 我期望的輸出類似 * templates/default * templates/detault/images * ... */
這個代碼沒測試。
不建議在函數中使用echo,就算是練習也一樣,因為echo出來的東西就無法被繼續處理了,所以應該盡量避免。同時echo也會影響你的思維方式,先處理再輸出的時候,你的注意力可以集中在當前的步驟上,而邊處理邊輸出相當於一心二用。