2010-08-11 14 views
1

J'essaie d'utiliser une fonction exemple sur le site Web du manuel PHP (posté par un utilisateur). La fonction est supposée renvoyer un tableau imbriqué de tous les fichiers et/ou dossiers dans un répertoire spécifié de votre serveur. J'apprenais juste php, donc je pense qu'il est plus probable que je fasse quelque chose de mal, et moins probable que la fonction ne fonctionne pas. Mais s'il y a une méthode plus facile que la fonction ci-dessous s'il vous plaît faites le moi savoir.Le code pour créer un tableau imbriqué de tous les fichiers dans un répertoire & sous-répertoires avec PHP ne fonctionne pas

Je suis capable de parcourir et d'écho tous les fichiers dans le chemin de base, mais pas les fichiers dans mon sous-dossier exemple. L'index où le sous-dossier doit être est vide ou juste le nom du dossier et non un tableau en fonction des paramètres que j'utilise. Quand j'ai pu obtenir le nom du dossier, je l'ai testé avec is_array qui renvoyait false.

Voici la fonction:

list_array: retourne un tableau contenant éventuellement tous les fichiers, seuls les répertoires ou uniquement les fichiers à un chemin de système de fichiers

  • @param string base_path de $, soit un chemin absolu ou relatif

  • @param répertoires $ filter_dir booléen Filter de résultat (sauf dans le dernier ignorés répertoire si récursive $ est vrai)

  • @param filter_files de $ fichiers booléennes Filtrer les résultats de

  • @param $ ne comprennent pas la chaîne chaîne de tube délimité de fichiers à ignorer toujours

  • @param $ booléenne récursive répertoire Descend vers le bas?

  • @return $ tableau result_list tableau imbriqué ou faux

    function directory_list($directory_base_path, $filter_dir = false, $filter_files = false, $exclude = ".|..|.DS_Store|.svn", $recursive = true){ 
    $directory_base_path = rtrim($directory_base_path, "/") . "/"; 
    
    if (!is_dir($directory_base_path)){ 
        error_log(__FUNCTION__ . "File at: $directory_base_path is not a directory."); 
        return false; 
    } 
    
    $result_list = array(); 
    $exclude_array = explode("|", $exclude); 
    
    if (!$folder_handle = opendir($directory_base_path)) { 
        error_log(__FUNCTION__ . "Could not open directory at: $directory_base_path"); 
        return false; 
    }else{ 
        while(false !== ($filename = readdir($folder_handle))) { 
         if(!in_array($filename, $exclude_array)) { 
          if(is_dir($directory_base_path . $filename . "/")) { 
           if($recursive && strcmp($filename, ".")!=0 && strcmp($filename, "..")!=0){ // prevent infinite recursion 
            error_log($directory_base_path . $filename . "/"); 
            $result_list[$filename] = directory_list("$directory_base_path$filename/", $filter_dir, $filter_files, $exclude, $recursive); 
           }elseif(!$filter_dir){ 
            $result_list[] = $filename; 
           } 
          }elseif(!$filter_files){ 
           $result_list[] = $filename; 
          } 
         } 
        } 
        closedir($folder_handle); 
        return $result_list; 
    } 
    

    }

Voici une des nombreuses choses que j'ai essayé. Le tableau contient 5 éléments, mais seulement 4 d'entre eux s'affichent. Echo $ array [4] est vide. J'essaie juste d'obtenir le tableau imbriqué à ce stade. Mais s'il y a un moyen plus facile de parcourir, tous les conseils sont très appréciés.

$directory_base_path = "../sandbox/"; 
$filter_dir = false; 
$filter_files = false; 
$exclude_files = ".|..|.DS_Store|dir_read_test.php"; 
$recursive = true; 
$array = directory_list($directory_base_path, $filter_dir, $filter_files, $exclude_files, $recursive); 
$array_length = count($array); 
echo $array_length; 
echo "<br/>"; 
$count = 0; 

while ($array_length >= $count) { 
echo $array[$count]; 
echo "<br/>"; 
$count = $count + 1; 
} 

Répondre

4

Jetez un oeil à portée de cette routine:

$result_list[$filename] = directory_list(/*recursive*/); 
else 
    $result_list[] = $filename; 

Quelle est la différence? Les entrées récursives sont placées sous l'index $filename, tandis que les contenus directs sont placés sous un index croissant ascendant, en utilisant []. Votre boucle affichera uniquement les index entiers.

Si vous

print_r($array); 

vous verrez toutes les entrées. (Ou vous pouvez remplacer [$filename] avec [], bien sûr.) Pour boucler par vous-même, remplacer la boucle while avec

foreach ($array as $k=>$v) 
{ 
    echo "$k: $v<br/>"; 
} 

(subdir, cela montrera « subdir: Array », mais c'est un autre sujet, vous pouvez tester is_array($v) et prendre des mesures sur cette base)

+0

Ok, merci. Travailler parfaitement maintenant. – Baa