[fonction recursive]affichage de contenu d'un dossier en ascii

affichage de contenu d'un dossier en ascii [fonction recursive] - PHP - Programmation

Marsh Posté le 21-07-2005 à 18:11:16    

Bonjour à tous,
 
Bon, ca peut paraitre bizarre... mais bon, je suis en train de faire un petit site Web, et je voudrait pouvoir afficher le contenus de dossier pour des download ou bien même le plan du site avec cette fonction...
 
Elle prend en argument un tableau associatif contenant les noms des dossier et des fichiers de toute l'arborescence comme indiqué ici...
 
le resultat que je voudrait avoir est marqué en exemple sur cette même page, et bien sur le resultat de la fonction est entre les 2...
 
Tout marche, sauf quand on arrive au dernier repertoire... il m'affiche pleins de | en trop...
 
Si quelqu'un arrive à voir comment est ce que je peux m'arrnager pour que ca marche, ca serait sympa...
 
et puis si vous avez des idées pour optimiser tout ce bazar, je suis aussi preneur...
 
la fonction :  

Code :
  1. <?php
  2. function asciirec( $var, $dig = 0 )
  3. {
  4.    // Declaration des chaines utilisées
  5.    $item  = '+--' ;
  6.    $decal = '   ' ;
  7.    $indic = '|' ;
  8.  
  9.    echo $var[0] , "\n" ;
  10.    unset( $var[0] ) ;
  11.                              
  12.    // créé la premiere ligne...       
  13.    $tmp = $dig ;                     
  14.    do{                       
  15.       echo $indic ;
  16.              
  17.       if( $tmp != 0 ) echo $decal ;
  18.          else echo  "\n" ;   
  19.       $tmp-- ;                       
  20.    }while( $tmp >= 0 ) ;             
  21.                              
  22.    // on parcours chaque elements du repertoire
  23.    for($i = 1 ; $i <= count( $var ) ; $i++ )
  24.    { 
  25.       // si c'est un repertoire, alors on recurse...
  26.       if( is_array( $var[$i] ) and count( $var[$i] ) != 1 )
  27.       {
  28.          //... en n'oubliant pas de decaler l'item...
  29.          for( $j = 0 ;$j < $dig ; $j++ )
  30.             echo $indic, $decal ;
  31.          echo $item ;
  32.          asciirec( $var[$i] , $dig+1 ) ;
  33.       }
  34.       else
  35.       //Sinon on affiche l'element...
  36.       {
  37.          //tout aussi décalé...
  38.          $tmp = $dig -1 ;
  39.          while( $tmp >= 0 )
  40.          {
  41.             echo $indic,$decal;
  42.             $tmp-- ;
  43.          }
  44.      
  45.          //dirty Hack for dir's names...
  46.          if( is_array( $var[$i] ) ) $var[$i] = $var[$i][0] ;
  47.    
  48.          // affichage du fichier...
  49.          echo $item , $var[$i] , "\n" ;
  50.    
  51.          // et bien sur on fait les decalages pour les fins de  
  52.          // directory...
  53.          if( $i == count( $var ) and $dig != 0 )
  54.          {
  55.             $tmp = $dig-1 ;
  56.             do{
  57.                echo $indic ;
  58.              
  59.                if( $tmp != 0 ) echo $decal ;
  60.                   else echo  "\n" ;
  61.                $tmp-- ;
  62.             }while( $tmp >= 0 ) ;
  63.          }
  64.       }
  65.    }
  66. }
  67. ?>

Reply

Marsh Posté le 21-07-2005 à 18:11:16   

Reply

Marsh Posté le 21-07-2005 à 23:00:46    

J'essaie déjà de comprendre ton truc là mais spa très clair tout ça, un tableau qui contient des liens, des "dossiers", des "items", des "toto", des sous-array... [:mlc]  
 
Faudrait faire un schéma plus clair, et filer la définition PHP d'un tel tableau aussi histoire qu'on puisse tester la fonc.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 22-07-2005 à 11:28:43    

ok, je vais vous faire ca...

Reply

Marsh Posté le 23-07-2005 à 08:42:50    

ici, il y a la structure du tableau...
http://dev.tdl.free.fr/recscan/test.php
 
autrement, le voici :  

Code :
  1. $var = array( 0 => 'dossier',
  2.               1 => array( 0 => '<a href="#">un lien pour tester</a>',
  3.                                array( 'subdir',
  4.                                       'item2',
  5.                                       'item3' ),
  6.                                'item' ),
  7.               2 => array('toto'),
  8.               3 => array('tato'),
  9.               4 => array( 0 => 'dir1',
  10.                                array( 'subdir',
  11.                                       'item2',
  12.                                       'item3' ),
  13.                                'item' ),
  14.             ) ;

Reply

Marsh Posté le 23-07-2005 à 12:23:59    

Bon j'ai passé un ptit bout de temps dessus, voilà ce que je propose :
 

Code :
  1. /**
  2. * Affiche une arborescence
  3. * @param array $tree Arborescence a afficher, contient en [0] le nom du noeud, puis en [1 ... n - 1] ses items
  4. * @param array $array_last Tableau de booleens indiquant les derniers items de chaque "sur-arborescence"         
  5. */
  6. function display_tree($tree, $array_last = array(1)) {
  7. // Constantes statiques
  8. static $item_prefix  = '+--';
  9. static $one_wire = '|';
  10. static $one_shift = '&nbsp;&nbsp;&nbsp;';
  11. static $wire_shift = '&nbsp;';
  12. // Nombre d'items & profondeur courante de l'arborescence
  13. $nb_items = count($tree) - 1;
  14. $depth = count($array_last);
  15. // Suite de "fils" (wires) a inserer horizontalement
  16. $depth_wire = '';
  17. for ($i = 1; $i < $depth; $i++) {
  18.  if ($array_last[$i] == 0) {
  19.   $depth_wire .= $one_wire;
  20.  }
  21.  else {
  22.   $depth_wire .= $wire_shift;
  23.  }
  24.  $depth_wire .= $one_shift;
  25. }
  26. // Nom du noeud pere
  27. echo $tree[0], '<br />';
  28. // Si l'arbre ne contient aucun item, arreter la
  29. if ($nb_items == 0) {
  30.  return;
  31. }
  32. // Permet d'aerer la presentation
  33. echo $depth_wire, $one_wire, '<br />';
  34. // Affiche chaque item ou sous-arbre
  35. for ($i = 1; $i <= $nb_items; $i++) {
  36.  // Suite de "fils" (wires) a inserer horizontalement
  37.  echo $depth_wire, $item_prefix;
  38.  // Affichage de chaque item de l'arbre
  39.  if (is_array($tree[$i])) {
  40.   array_push($array_last, $i == $nb_items);
  41.   display_tree($tree[$i], $array_last);
  42.   array_pop($array_last);
  43.  }
  44.  else {
  45.   echo $tree[$i], '<br />';
  46.  }
  47. }
  48. // Permet d'aerer la presentation
  49. echo $depth_wire, '<br />';
  50. }


Message édité par sielfried le 23-07-2005 à 12:27:42

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 23-07-2005 à 12:41:05    

Argh ca marche tout bien !!!
 
Ben merci... mais des pistes m'aurait suffit... la il y a toute la solution, c'est plus très drole...  
 
Bon, un detail quand même, mais qui se change facilement... je veux du texte pure... donc s/&nbsp;/ /g et s/<br \/>/\\n/g
 
mais à part ca nickel... encore merci... ( mais bon, j'aurait prefere la coder moi même... )

Reply

Marsh Posté le 23-07-2005 à 12:53:53    

Ben c'était plus un problème d'algo que de PHP là, et j'avais pas trop de "pistes" claires avant de plancher un peu dessus.
 
Au final autant te filer ce que j'ai fait, la seule vraie nouvelle "idée" étant ce tableau de booléens pour indiquer là où se trouve les derniers éléments de chaque étage, histoire qu'il mette pas des '|' là où il faut pas.  
 
Par contre j'ai refait toute la fonction parce que ça me paraissait un peu compliqué pour rien.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 23-07-2005 à 13:04:34    

et bien, je suis en train de decortiquer tout ca, ca m'a l'air tout bien...
 
( je sais bien que c'est un probleme d'algo... mais bon, je l'ai faite en php alors bon...)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed