2015-01-19 2 views
1

Я пытаюсь написать функцию recursivephp, которая печатает в них каталоги и файлы. Я знаю, что могу использовать RecursiveIteratorIterator из php, но это еще не точка, я просто пытаюсь обновить свой навык в recursive functions так вот мой текущий код:Функция списка рекурсивных файлов

<?php 
function recursiveDir($adr){ 
    $dh = opendir($adr); 
    while (false !== ($filename = readdir($dh))) { 
     if(is_dir($adr.'/'.$filename)&& $filename!='.' && $filename!='..'){   
      recursiveDir($adr.'/'.$filename); 
     } elseif($filename!='.' && $filename!='..') { 
      echo $filename.'<br>'; 
     } 
    } 
} 
$dir = getcwd(); 
recursiveDir($dir); 
?> 

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

+0

Я думаю, что я положил 'в то время как loop' в неправильном месте – NimaNr

ответ

0

Я проверил вашу функцию, и она работает, но я хочу, чтобы придумать с этими замечаниями:

<?php 
/** 
    * @param String $adr 
    * @param Integer $depth : to show nicely the tree 
    */ 
function recursiveDir($adr, $depth = 0) { 
    $depth++; 
    $dh = opendir ($adr); 

    if(is_null($dh)) { 
     printf ("Can not open this directory %s (may be permission is denied)", $adr); 
     return NULL; 
    } 
    // use upper case for TRUE, FALSE and NULL : PHP recommendation 
    while (FALSE !== ($filename = readdir ($dh))) { 
     // it will be easy for another developer what do you want to escape from execution 
     if ($filename == '.' || $filename == '..') { 
      continue; 
     } 

     if (is_dir ($adr.'\\'.$filename)) {   
      // use printf instead of echo or print, it lets separating between variables and the formatted message    
      printf ("%s DIR: %s.\n", str_repeat ("-", $depth), $adr . '\\' . $filename); 
      recursiveDir ($adr . '\\' . $filename); 
     } elseif (is_file ($adr.'\\'.$filename)) { 
      printf ("%s FILE: %s.\n", str_repeat ("-", $depth + 4), $adr.'\\'.$filename); 
     // ALWAYS : write/do something in uncatched cases ... 
     } else { 
      printf ("Unknown Resource: %s\n", $adr . '\\' . $filename); 
     } 
    } 
    // never forget to close an opened resource 
    closedir ($dh); 
} 
$dir = getcwd(); 
recursiveDir($dir); 
+0

Я думаю, когда вы вызываете функцию внутри функции вы можете использовать ее как: recursiveDir ($ adr. '\\'. $ filename, $ depth + 4); – NimaNr

Смежные вопросы