2010-11-17 2 views
2

У меня есть следующая функция, когда я пытаюсь вернуть vaule только одну папку 1, но когда я повторяю функцию, она отображает правильную информацию.return in function не работает, но echo работает в PHP

PHP код:

$FolderList = ""; 

function ListFolder($path) { 
    $path = str_replace("//","/",$path); 

    //using the opendir function 
    $dir_handle = @opendir($path) or die("Unable to open $path"); 

    //Leave only the lastest folder name 
    $dirname = end(explode("/", $path)); 

    //display the target folder. 
    $FolderList .= ('<option value="">'.$path.'</option>'); 

    while(false !== ($file = readdir($dir_handle))) { 
     if($file!="." && $file!="..") { 
      if(is_dir($path."/".$file)) { 
       //Display a list of sub folders. 
       ListFolder($path."/".$file); 
      } 
     } 
    } 

    //closing the directory 
    closedir($dir_handle); 

    return $FolderList; //ERROR: Only Shows 1 Folder 
    echo $FolderList; //WORKS: Show All The Folders Correctly 
} 

Благодаря

+1

Я считаю, что это имеет отношение к области видимости, но мой мозг не работает достаточно хорошо, прямо сейчас, чтобы понять это ... Вы определяете $ FolderList вне функции и I что вы получаете ненадежные результаты, если вы не определяете переменную как статическую и/или глобальную. – Patrick

+0

Связанное сообщение: http://stackoverflow.com/questions/4204728/how-to-display-folders-and-sub-folders-from-dir-in-php? –

+0

Я пробовал его внутри функции и что-то происходит – Rickstar

ответ

2

Дайте этому выстрел:

function ListFolder($path) 
{ 
    $path = str_replace("//","/",$path); 

    //using the opendir function 
    $dir_handle = @opendir($path) or die("Unable to open $path"); 

    //Leave only the lastest folder name 
    $dirname = end(explode("/", $path)); 
    //display the target folder. 
    $FolderList = ('<option value="">'.$path.'</option>'); 
    while (false !== ($file = readdir($dir_handle))) 
    { 
     if($file!="." && $file!="..") 
     { 
      if (is_dir($path."/".$file)) 
      { 
       //Display a list of sub folders. 
       $FolderList .= ListFolder($path."/".$file); 
      } 
     } 
    } 


    //closing the directory 
    closedir($dir_handle); 

    return $FolderList; 
} 

echo ListFolder('/path/to/folder/'); 

Я просто изменил $FolderList быть отнесены к возвращаемому значению функции ListFolder.

1

Каждый вызов функции имеет свой собственный variable scope. Вы должны союзу возвращаемого значения из вашего рекурсивного вызова с тем, что вы собрались в петле while:

while(false !== ($file = readdir($dir_handle))) { 
    if($file!="." && $file!="..") { 
     if(is_dir($path."/".$file)) { 
      $FolderList .= ListFolder($path."/".$file); 
     } 
    } 
} 
2

Внутри вашего цикла в то время, вы снова вызов ListFolder. Это нормально, но вы не сохраняете результат нигде и просто повторяете результат каждый раз, когда вызывается ListFolder.

Этот правильный формат, который вы видите на странице, не соответствует тому, что в конце повторяется одна строка. его единичный каталог эхом повторяется каждый раз, когда вызывается ListFolder.

Ниже приведен код, который работает.

function ListFolder($path) 
{ 

    $FolderList = ""; 
    $path = str_replace("//","/",$path); 

    //using the opendir function 
    $dir_handle = @opendir($path) or die("Unable to open $path"); 

    //Leave only the lastest folder name 
    $dirname = end(explode("/", $path)); 
    //display the target folder. 

    $FolderList .= ('<option value="">'.$path.'</option>'); 

    while (false !== ($file = readdir($dir_handle))) 
    { 
     if($file!="." && $file!="..") 
     { 
      if (is_dir($path."/".$file)) 
      { 
       //Display a list of sub folders. 
       $FolderList .= ListFolder($path."/".$file); 
      } 
     } 
    } 

    //closing the directory 
    closedir($dir_handle); 

    return $FolderList; 
} 
1

Вы забыли поймать возвращаемое значение функции вызывает

$FolderList .= ListFolder($path."/".$file); 

Вы просто добавить одну папку в строке, чем вызов функции, но ничего не делать с возвращаемым значением. Затем вы возвращаетесь $ FolderList, который содержит только одну запись, добавить до в то время как петли

Когда * эхо * ING его, его просто отправить непосредственно в браузере независимо на каком уровне рекурсии вы, так что вы думаю, что $ FolderList полон, но на самом деле его просто каждый сон $ FolderList с каждого этапа рекурсии.

0

Альтернативный метод

function ListFolder($path, &$FolderList = array()) { 
    $path = str_replace("//","/",$path); 

    //using the opendir function 
    $dir_handle = @opendir($path) or die("Unable to open $path"); 

    //Leave only the lastest folder name 
    $dirname = end(explode("/", $path)); 

    //display the target folder. 
    $FolderList[] = '<option value="">'.$path.'</option>'; 

    while(false !== ($file = readdir($dir_handle))) { 
     if($file!="." && $file!="..") { 
      if(is_dir($path."/".$file)) { 
       //Display a list of sub folders. 
       ListFolder($path."/".$file, $FolderList); 
      } 
     } 
    } 

    //closing the directory 
    closedir($dir_handle); 

    return $FolderList; 
} 

$paths = ListFolder(getcwd()); 
echo "<select>".implode("", $paths)."</select>";