2010-03-23 11 views
0

J'utilise le code suivant pour obtenir un tableau de répertoires et leurs sous-répertoires où chacun contient l'extension de type de fichier: png. Cela fonctionne très bien mais je dois être capable de sortir les résultats du tableau dans un format de style de liste, par exemple.Affichage `pretty output` du contenu du répertoire du tableau

* Test 
    -> test2.png 
    -> test1.png 
    * subfolder 
    -> test3.png 
    * sub sub folder 
     -> test4.png 

etc

code:

$filter=".png"; 
$directory='../test'; 
$it=new RecursiveDirectoryIterator("$directory"); 
foreach(new RecursiveIteratorIterator($it) as $file){ 
    if(!((strpos(strtolower($file),$filter))===false)||empty($filter)){ 
     $items[]=preg_replace("#\\\#", "/", $file); 
    } 
} 

tableau Exemple de résultats:

array (
    0 => '../test/test2.png', 
    1 => '../test/subfolder/subsubfolder/test3.png', 
    2 => '../test/subfolder/test3.png', 
    3 => '../test/test1.png', 
) 

Quelle serait la meilleure façon d'atteindre le résultat escompté?

Répondre

0

Dans votre article si, essayez:

$items[]=preg_replace("#\\\#", "/", $file->getPathName()); 

Cela devrait vous donner une sortie proche de celle que vous désirez. Cependant, getPathName génère des chemins absolus.

+0

Merci. Mais je suis après l'affichage sous forme de texte formaté sur un site Web, par exemple. Directory-> - Photo - Photo - Annuaire -> - Photo - Photo Donc, on peut voir une représentation structurelle des données. –

+0

Ah, d'accord. Vous avez mal compris là-bas. – Turbotoast

0

Si vous souhaitez afficher les fichiers avant les répertoires, vous ne pouvez pas le faire simplement en boucle, car vous ne saurez pas si plus de fichiers viendraient plus tard.

Vous devez agréger les données dans un arbre (tableau de tableaux indexés par un composant de chemin) ou le trier.

$components = explode('/',$path); 
$file = array_pop($components); 
$current = $root; 
foreach($components as $component) { 
    if (!isset($current[$component])) $current[$component] = array(); 
    $current = &$current[$component]; 
} 
$current[$file] = true; 

Il devrait vous donner une structure telle que:

array(
    'test'=>array(
     'test1.png'=>true, 
     'subfolder'=>array(
     … 

Ce sera facile de travailler avec (bien sûr que défaites un peu le but de RecursiveDirectoryIterator Vous pouvez obtenir le même par récursive en utilisant DirectoryIterator régulière.).

Ou si vous triez les chemins par profondeur (écrivez votre fonction de comparaison), alors vous serez en mesure de le sortir simplement en imprimant le dernier composant de chemin avec l'indentation appropriée.