IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Tri arborescence de fichier


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 22
    Points : 11
    Points
    11
    Par défaut Tri arborescence de fichier
    Bonjour à tous,

    Mon projet est de lister une arborescence complète d'un répertoire donné.
    Jusqu'ici, j'arrive bien à récupérer dans un tableau les dossiers, sous-dossier et fichier correspondant.

    Seulement, je n'arrives pas à faire le tri "à la manière de windows" ; c'est-à-dire, les dossiers par ordre alphabétique en premier et les fichiers par ordre alphabétique en second.

    Voici mon code pour être plus clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    $dir = 'document_repository';
    $ritit = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
     
    $r = array();
    foreach ($ritit as $splFileInfo) { 
     
    	if($splFileInfo->isDir()){
    		$path = array($splFileInfo->getFilename() => array());
    	}else{
    		$path = array($splFileInfo->getFilename());
    	}
     
    	for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) {
    		$path = array($ritit->getSubIterator($depth)->current()->getFilename() => $path);
    	}
    	$r = array_merge_recursive($r, $path);
    }
     
    echo '<pre>';
    print_r($r);
    echo '</pre>';
    Voici le resultat que cela me donne (un ordre alphabétique tout simple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Array
    (
        [0] => atest.docx
        [dossier1] => Array
            (
                [0] => feuille_de_style.css
                [1] => htest.xlsx
                [2] => logo.png
                [3] => test.jnt
            )
     
        [dossier2] => Array
            (
                [0] => dtest.pptx
                [1] => HE ingerables.pdf
                [2] => jtest.docx
                [sous-dossier2] => Array
                    (
                        [0] => dtest.jnt
                        [1] => logo.png
                        [2] => qlogo.jpg
                        [3] => test.zip
                        [4] => zfeuille_de_style.css
                    )
     
                [3] => test.xlsx
                [4] => wtest.txt
            )
     
        [1] => HE ingerables.pdf
        [2] => htest.txt
        [3] => logo.jpg
        [4] => mtest.pptx
        [5] => test.zip
    )
    mais j'aimerais avoir ce résultat (ordre alphabétique avec les dossiers en premier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    Array
    (
        [0] => atest.docx
        [dossier1] => Array
            (
                [0] => feuille_de_style.css
                [1] => htest.xlsx
                [2] => logo.png
                [3] => test.jnt
            )
     
        [dossier2] => Array
            (
                [sous-dossier2] => Array
                    (
                        [0] => dtest.jnt
                        [1] => logo.png
                        [2] => qlogo.jpg
                        [3] => test.zip
                        [4] => zfeuille_de_style.css
                    )
                [0] => dtest.pptx
                [1] => HE ingerables.pdf
                [2] => jtest.docx
                [3] => test.xlsx
                [4] => wtest.txt
            )
     
        [1] => HE ingerables.pdf
        [2] => htest.txt
        [3] => logo.jpg
        [4] => mtest.pptx
        [5] => test.zip
    )
    Une personne pour m'aider?

    Merci

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    A priori, ton tableau est correctement rempli. Ton problème, c'est l'affichage du tableau et/ou le tri du tableau.
    Il va donc falloir que tu fasses un tri qui considère que les sous-tableaux sont avant les champs simples, et triés sur la clé au lieu de la valeur, le tout sans perdre les clés des tableaux.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    un truc du genre (en plus de ton code) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    function affiche_dir_content($tabs)
    {
    	$dir_array = array();
    	$fil_array = array();
    	// on sépare les dossiers des fichiers
    	foreach($tabs as $index=>$tab){
    		if(is_array($tab)){
    			$dir_array[$index] = $tab;
    		} else {
    			$fil_array[$index] = $tab;
    		}
    	}
    	// on affiche la liste des dossiers
    	if(!empty($dir_array)){
    		echo'	<ul>'."\n";
    		foreach($dir_array as $index=>$dir){
    			echo'	<li><img src="images/folder.png" alt=""/>&nbsp;'.$index.'</li>'."\n";
    			affiche_dir_content($dir);
    		}
    		echo'	</ul>'."\n";
    	}
    	// on affiche la liste des fichiers
    	if(!empty($fil_array)){
    		echo'	<ul>'."\n";
    		foreach($fil_array as $fil){
    			echo'	<li><img src="images/file_extension_txt.png" alt=""/>&nbsp;'.$fil.'</li>'."\n";
    		}
    		echo'	</ul>'."\n";
    	}
    }
    affiche_dir_content($r);

    J'avais aussi trouvé ça : exploreur_dossier.zip
    Les sous-dossiers s'ouvrent au clic, et se ferment au double-clic.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?php 
    function dir_scan_html($dir,$niveau=0,$id=0)
    {
    $html=null;
    $html_repertoires=null;
    $html_fichiers=null;
    	if ($handle = opendir($dir)) {
    		while (false !== ($entry = readdir($handle))) {
    			$id++;
    			if(is_dir($dir."/".$entry))
    			{
    				if($entry!='..' && $entry!='.')
    				{
    				 $html_repertoires .= str_repeat("\t",$niveau)."<div id='div_".$id."' style='border:solid 0px #00FF00;' onclick='document.getElementById(\"sub_".$id."\").style.display=\"block\"' onDblclick='document.getElementById(\"sub_".$id."\").style.display=\"none\"'>";
    				 $html_repertoires .= str_repeat("<img src='images/vide.png' border='0'>",$niveau);
    				 $html_repertoires .= "<img src='images/folder.png' border='0'>";
    				 $html_repertoires .= "".$entry."";
    				 $html_repertoires .= "";
    				 $html_repertoires .= "";
    				 $html_repertoires .= str_repeat("\t",$niveau)."</div mid='div_".$id."'>\n";
    					//echo ".".$entry."<br>";
    				 $niveau++;
    				 $html_repertoires .= str_repeat("\t",$niveau)."<div id='sub_".$id."' style='display:none;border:solid 0px #FF0000;' >\n";
    				 $html_repertoires .= dir_scan_html($dir."/".$entry,$niveau,$id);
    				 $html_repertoires .= str_repeat("\t",$niveau)."</div mid='sub_".$id."'>\n";
    				 $niveau--;
    				}				
    			}else{
    				 $html_fichiers .= str_repeat("\t",$niveau)."<div id='fil_".$id."'>";
    				 $html_fichiers .= str_repeat("<img src='images/vide.png' border='0'>",$niveau);
    				 $html_fichiers .= "<img src='images/file_extension_txt.png' border='0'>";
    				 $html_fichiers .= "<a href='".$dir."/".$entry."' target='_blank'>".$entry."</a>";
    				 $html_fichiers .= "</div>\n";
    					//echo " ".$entry."<br>";
    			}
    		}
    		closedir($handle);
    		$html.=$html_repertoires;
    		$html.=$html_fichiers;
    		return $html;
    	}    
    }
    $html = dir_scan_html("../");
    echo $html;
    ?>
    N.B. L'archive contient aussi les pictos "dossier" et "fichier".
    Dernière modification par Invité ; 02/10/2015 à 15h32.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    C'est parfait ça
    Un grand merci!

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai fait mieux (code optimisé) :


    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php 
    function explore_dir_scan_html($dir,$niveau=0,$id=0)
    {
    	$html = null;
    	$html_repertoires = null;
    	$html_fichiers = null;
    	if ($handle = opendir($dir)) {
    		while (false !== ($entry = readdir($handle))) {
    			$id++;
    			if(is_dir($dir."/".$entry))
    			{
    				if($entry!='..' && $entry!='.')
    				{
    				 $html_repertoires .= str_repeat("\t",$niveau+1)."<li class='dir' id='div_".$id."'>".$entry."\n";
    				 $html_repertoires .= str_repeat("\t",$niveau+2)."<ul class='sub_dir' id='sub_".$id."'>\n";
    				 $html_repertoires .= explore_dir_scan_html($dir."/".$entry,$niveau+1,$id);
    				}				
    			}else{
    				 $html_fichiers .= str_repeat("\t",$niveau+2)."<li class='fil' id='fil_".$id."'><a href='".$dir."/".$entry."' target='_blank'>".$entry."</a></li>\n";
    			}
    			if(is_dir($dir."/".$entry))
    			{
    				if($entry!='..' && $entry!='.')
    				{
    				 $html_repertoires .= str_repeat("\t",$niveau+2)."</ul>\n";
    				 $html_repertoires .= str_repeat("\t",$niveau+1)."</li>\n";
    				}
    			}
    		}
    		closedir($handle);
    		$html.=$html_repertoires;
    		$html.=$html_fichiers;
    		return $html;
    	}    
    };
    ?>
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <!DOCTYPE html>
    <html>
    <head>
    	<title></title>
    	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
            $('#exploreur-dossier').on('click', '.dir', function(){
                    $(this).find('ul').first().toggle();
                    event.stopPropagation(); /* important */
            });
    });
    </script>
    <style>
    #exploreur-dossier ul { margin:0; padding:0; list-style:none outside none; }
    #exploreur-dossier .dir { position:relative; padding-left:20px; cursor:pointer; border:solid 0px #00FF00; }
    #exploreur-dossier .sub_dir { position:relative; padding-left:20px; cursor:pointer; display:none; border:solid 0px #FF0000;; }
    #exploreur-dossier .fil { position:relative; padding-left:20px; }
    #exploreur-dossier .dir:before { position:absolute; content:''; display:block; width:16px; height:16px; top:2px; left:0; background:url(images/folder.png) no-repeat; }
    #exploreur-dossier .fil:before { position:absolute; content:''; display:block; width:16px; height:16px; top:2px; left:0; background:url(images/file.png) no-repeat; }
    </style>
    </head>
    <body>
     
    <nav id="exploreur-dossier">
    <ul>
    <?php echo explore_dir_scan_html(".."); // N.B. la fonction étant récursive, on ne peut pas mettre les balises <ul> dedans ?>
    </ul>
    </nav>
     
    </body>
    </html>
    Dernière modification par Invité ; 03/10/2015 à 02h14.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Oui, sauf que le clique ne fonctionne pas bien pour les sous-répertoire.

    Je n'ai pas mis le nez dans le code, juste regarder ce que ça donne.
    C'est pas bien méchant à corriger

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est corrigé dans le 2.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Je voulais dire justement que dans le 2, le javascript ne fonctionne pas bien.
    Quand on clique pour refermer un sous-dossier, c'est le dossier parent que ce referme.

  9. #9
    Invité
    Invité(e)
    Par défaut

    (code mis à jour dans le message précédent)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri d'un fichier
    Par Premium dans le forum C
    Réponses: 14
    Dernier message: 15/01/2006, 23h55
  2. tri d'un fichier texte
    Par ben127 dans le forum C
    Réponses: 7
    Dernier message: 23/12/2005, 21h03
  3. [JFileChooser] Personnaliser l'accès à l'arborescence des fichiers
    Par Cylise dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 10/09/2005, 11h42
  4. [Conception] Représenter une arborescence de fichiers
    Par Wookai dans le forum Général Java
    Réponses: 9
    Dernier message: 26/07/2005, 13h45
  5. Un peu de lumière sur l'arborescence des fichiers de Linux
    Par Noki dans le forum Administration système
    Réponses: 6
    Dernier message: 07/04/2004, 17h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo