2009-11-27 56 views
0

我想使用递归扫描文件夹的函数,并将每次扫描的内容分配给一个数组。在PHP中以增量深度动态生成阵列

它足够简单,通过使用next()或foreach递归遍历数组中的每个后续索引 - 但是如何动态地向数组添加深度层(无需将其硬编码到函数中)会给我带来问题。这里有一些伪:

function myScanner($start){ 

    static $files = array(); 

    $files = scandir($start); 
    //do some filtering here to omit unwanted types 

    $next = next($files); 


    //recurse scan 

    //PROBLEM: how to increment position in array to store results 
    //$next_position = $files[][][].... ad infinitum 

    //myScanner($start.DIRECTORY_SEPARATOR.$next); 
} 

任何想法?

回答

2

尝试这样:

// $array is a pointer to your array 
// $start is a directory to start the scan 
function myScanner($start, &$array){ 
    // opening $start directory handle 
    $handle = opendir($start); 

    // now we try to read the directory contents 
    while (false !== ($file = readdir($handle))) { 
    // filtering . and .. "folders" 
    if ($file != "." && $file != "..") { 
     // a variable to test if this file is a directory 
     $dirtest = $start . DIRECTORY_SEPARATOR . $file; 

     // check it 
     if (is_dir($dirtest)) { 
     // if it is the directory then run the function again 
     // DIRECTORY_SEPARATOR here to not mix files and directories with the same name 
     myScanner($dirtest, $array[$file . DIRECTORY_SEPARATOR]); 
     } else { 
     // else we just add this file to an array 
     $array[$file] = ''; 
     } 
    } 
    } 

    // closing directory handle 
    closedir($handle); 
} 

// test it 
$mytree = array(); 
myScanner('/var/www', $mytree); 

print "<pre>"; 
print_r($mytree); 
print "</pre>"; 
+0

我会给它一个旋转,虽然目前不工作... – sunwukung 2009-11-27 15:41:32

+0

再试一次,我修好了一点:) – silent 2009-11-27 15:42:14

+0

,完美的工作。我没有考虑使用引用。此行: myScanner($ dirtest,$ array [$ file。DIRECTORY_SEPARATOR]); 是难倒我的人 - 我没有看到联想键在哪里被添加 - 直到我明白参考启动变量。我今天学到了一些有价值的东西 - 谢谢! – sunwukung 2009-11-27 18:54:20

0

尝试使用此功能(和编辑你的需求):

function getDirTree($dir,$p=true) { 
    $d = dir($dir);$x=array(); 
    while (false !== ($r = $d->read())) { 
     if($r!="."&&$r!=".."&&(($p==false&&is_dir($dir.$r))||$p==true)) { 
      $x[$r] = (is_dir($dir.$r)?array():(is_file($dir.$r)?true:false)); 
     } 
    } 

    foreach ($x as $key => $value) { 
     if (is_dir($dir.$key."/")) { 
      $x[$key] = getDirTree($dir.$key."/",$p); 
     } 
    } 

    ksort($x); 
    return $x; 
} 

它返回目录的排序数组。

+1

许多感谢.... ......但没有想冒犯 - 这是一个相当密集的功能,我想要的东西一点点温和的 - 也许一些评论? – sunwukung 2009-11-27 15:33:32