2009-11-27 4 views
0

Je souhaite utiliser une fonction pour analyser de façon récursive un dossier et affecter le contenu de chaque analyse à un tableau.formation dynamique de tableau avec profondeur incrémentale dans PHP

Il est assez simple de se répéter à travers chaque index successif du tableau en utilisant next() ou foreach - mais comment ajouter dynamiquement une couche de profondeur au tableau (sans le coder dans la fonction) me pose des problèmes. Voici quelques pseudo:

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); 
} 

des idées?

Répondre

2

Essayez quelque chose comme ceci:

// $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

Je vais lui donner un tourbillon, ne fonctionne pas si loin ... – sunwukung

+0

essayez à nouveau, j'ai fixé un peu :) – silent

+0

qui a parfaitement fonctionné. Je n'ai pas pensé à utiliser des références. Cette ligne: myScanner ($ dirtest, $ array [$ fichier. DIRECTORY_SEPARATOR]); est celle qui m'a bloqué - je ne voyais pas où les clés associatives étaient ajoutées - jusqu'à ce que je comprenne que les références initient des variables. J'ai appris quelque chose de précieux aujourd'hui - merci! – sunwukung

0

Essayez d'utiliser cette fonction (et le modifier pour vos demandes):

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

Il retourne un tableau de répertoires triée.

+1

un grand merci .... ... mais sans vouloir offenser - qui est une fonction assez dense, et je voudrais quelque chose d'un peu plus doux - peut-être certains commentaires? – sunwukung

Questions connexes