2014-09-10 2 views
0

"mp4"로 끝나는 파일 이름 만 가진 배열을 채우려 고합니다. 서브 디렉토리 목록을 통해 재귀 함수를 살펴 봅니다.반환 된 배열의 마지막 요소를 인쇄하는 PHP 만

foreach 루프를 사용하여 배열의 요소를 인쇄 할 때 return 문 앞에 모든 요소가 올바르게 표시됩니다. 그러나 메서드 반환에서 변수를 만들고 다시 반복하려고하면 배열의 마지막 항목 만받습니다.

루프의 재귀가 원인 일 수 있습니까? 다음과 같이

내 코드는 다음과 같습니다

<?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>"; 
} 
?> 

어떤 도움을 주시면 감사하겠습니다! 나는 슬픈 것에 대해 사과한다. PHP를 처음 사용합니다. 사전에

감사합니다!

+1

재귀 호출을 수행하면 반환 값과 관련된 작업을 수행하지 않습니다. – Barmar

+0

모든 .mp4 파일은 최상위 디렉토리가 아닌 하위 디렉토리에 있습니다. – Barmar

+0

그것은 나를 위해 잘 작동합니다. –

답변

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

정말 고마워요! 이것은 효과가있다! 그것이 가능한 한 빨리 대답을 받아 들일 것입니다! –

1

당신은 그래서 당신이 실제로 오직 첫 번째를 가져 오는 재귀 호출에 $의 배열을 전달하지, 더 재귀으로 볼 필요가 모든 후속 호출의 결과는

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

을 잃게됩니다

listFolderFiles를 호출하면 해당 파일을 현재 $ 배열에 추가해야하고 $ 배열을 후속 호출에 전달해야합니다. 재귀에 자세히 ...

인쇄 라인이 활성화되면, 모든 재귀 호출에서 호출되는 것이 아니라 끝에서 호출됩니다.

관련 문제