2014-09-10 207 views
0

我想用一個遞歸函數來查看通過子目錄列表的只有文件名以「mp4」結尾的數組。PHP只打印返回數組的最後一個元素

當我在return語句之前打印數組中的元素時,該數組顯示了所有元素, foreach循環。但是,當我從方法的返回中創建一個變量並嘗試再次遍歷它時,我只收到數組中的最後一個條目。

這可能是由循環中的遞歸引起的?

我的代碼如下:

<?php 
function listFolderFiles($dir){ 
    $array = array(); 
    $ffs = scandir($dir); 
    foreach($ffs as $ff){ 
     if($ff != '.' && $ff != '..'){ 
      // This successfully adds to the array. 
      if(substr($ff, -3) == "mp4"){ 
       $array[] = $ff; 
      } 

      // This steps to the next subdirectory. 
      if(is_dir($dir.'/'.$ff)){ 
       listFolderFiles($dir.'/'.$ff); 
      } 
     } 
    } 

    // At this point if I insert a foreach loop, 
    // all of the elements will display properly 

    return $array; 
} 

// The new '$array' variable now only includes the 
// last entry in the array in the function 
$array = listFolderFiles("./ads/"); 

foreach($array as $item){ 
    echo $item."<p>"; 
} 
?> 

任何幫助,將不勝感激!我爲這種sl ap行爲表示歉意。我是PHP新手。

在此先感謝!

+1

當你進行遞歸調用時,你不會對它的返回值做任何事情。 – Barmar 2014-09-10 20:21:11

+0

我敢打賭,所有'.mp4'文件都在一個子目錄中,而不是頂層目錄。 – Barmar 2014-09-10 20:21:41

+0

它適用於我:) – 2014-09-10 20:23:30

回答

2

當你遞歸到子目錄中時,你需要將其結果合併到數組中。否則,該數組只包含來自原始目錄的匹配文件,則丟棄子目錄中的匹配。

function listFolderFiles($dir){ 
    $array = array(); 
    $ffs = scandir($dir); 
    foreach($ffs as $ff){ 
     if($ff != '.' && $ff != '..'){ 
      // This successfully adds to the array. 
      if(substr($ff, -3) == "mp4"){ 
       $array[] = $ff; 
      } 

      // This steps to the next subdirectory. 
      if(is_dir($dir.'/'.$ff)){ 
       $array = array_merge($array, listFolderFiles($dir.'/'.$ff)); 
      } 
     } 
    } 

    // At this point if I insert a foreach loop, 
    // all of the elements will display properly 

    return $array; 
} 
+0

非常感謝!這工作!只要它讓我接受你的答案! – 2014-09-10 20:27:53

1

你需要尋找到遞歸多,你沒有通過$數組遞歸調用所以你實際上只曾獲得第一個回來,所有後續調用的結果都將丟失

if(is_dir($dir.'/'.$ff)){ 
    listFolderFiles($dir.'/'.$ff); 
} 

對listFolderFiles的調用需要將這些文件添加到當前的$數組中,並且需要將$數組傳遞給後續調用。閱讀更多的遞歸..

當您的打印行是活動的,它會在每次遞歸調用中調用,而不是在結束。

相關問題