Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2302 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1156406
Profil sup​primé
Posté le 21-07-2005 à 18:11:16  answer
 

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. ?>

mood
Publicité
Posté le 21-07-2005 à 18:11:16  profilanswer
 

n°1156639
sielfried
Posté le 21-07-2005 à 23:00:46  profilanswer
 

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
n°1156971
Profil sup​primé
Posté le 22-07-2005 à 11:28:43  answer
 

ok, je vais vous faire ca...

n°1157759
Profil sup​primé
Posté le 23-07-2005 à 08:42:50  answer
 

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

n°1157831
sielfried
Posté le 23-07-2005 à 12:23:59  profilanswer
 

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
n°1157843
Profil sup​primé
Posté le 23-07-2005 à 12:41:05  answer
 

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... )

n°1157852
sielfried
Posté le 23-07-2005 à 12:53:53  profilanswer
 

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
n°1157857
Profil sup​primé
Posté le 23-07-2005 à 13:04:34  answer
 

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...)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Affichage une image si scrollbar-face est activéZip de dossier en php
[SQL]fonction de comparaison de chaines[php-Xoops]Probleme de fichiers phpxx.tmp qui saturent le dossier temp
[PHP] tester si c'est un dossier[Résolu](j'espère)[JS] fonction de type isset
[Java - JLabel] Affichage d'imagesupload ecrire user choisit dossier ou il stocke
variable et contenu[JS] Faire disparaitre un bouton au lancement d'une fonction JS lourde
Plus de sujets relatifs à : [fonction recursive]affichage de contenu d'un dossier en ascii


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR