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

PHP & Base de données Discussion :

Structuration de chemins de dossiers en hiérarchie [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut Structuration de chemins de dossiers en hiérarchie
    Bonjour,

    Je dispose d'un fichier d'entrée qui contient des chemins de dossiers par lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dossier1/Dossier2/Dossier3
    Dossier1/Dossier2/Dossier4
    Dossier1/Dossier2/Dossier4/Dossier5
    Dossier1/Dossier2/Dossier4/Dossier6
    Je souhaiterais créer un fichier de sortie qui mette en forme hérarchique le fichier d'entrée de cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    - <folder>Dossier1
    	- <folder>Dossier2
    		- <folder>Dossier3
    		</folder>
    		- <folder>Dossier4
    			* <folder>Dossier5
    			</folder>
    			* <folder>Dossier6
    			</folder>
    		</folder>
    	</folder>
    - </folder>
    J'ai commencé à coder (pas très optimisé) mais ça ne donne pas ce que je veux mais le principal est la :
    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
     
    //Parcours du fichier pour remise en forme
    $fichier = fopen("fichier_entree.txt", "w" ); //Fichier pour écriture
    	$tableau = file("fichier_sortie.txt"); //Fichier pour lecteure stocké dans un tableau
    	if(is_array($tableau)) //Si la variable $tableau est bien un tableau, on peut continuer
    	{
    		$contenu_fichier = '';
    		$temp_derniere_colonne = '';
    		$chemin_sans_dernier_dossier_precedent = '';
    		foreach($tableau AS $ligne)
    		{
    			$nb_colonnes_tableau = substr_count($ligne,"/") + 1; //Nombre de slash dans la ligne puis + 1 = Nombre de colonnes dans le tableau
    			$tableau = split("/",$ligne);
     
    			//On récupère le chemin sans le dernier dossier
    			$chemin_sans_dernier_dossier = '';
    			for ($i=0;$i < $nb_colonnes_tableau-1;$i++)
    			{
    				$chemin_sans_dernier_dossier .= $tableau[$i].'/';
    				if ($chemin_sans_dernier_dossier == $chemin_sans_dernier_dossier_precedent)
    				{
    				}else{
    					fputs($fichier,'???');
    					fputs($fichier,"\n");
    				}
    			}
    			$num_derniere_colonne = $nb_colonnes_tableau - 1; // On récupère le numéro de la  dernière colonne du tableau et -1 car on commence à 0
    			fputs($fichier,'			<folder>'.$tableau[$num_derniere_colonne].'');
    			fputs($fichier,"\n");
    			fputs($fichier,'			</folder>');
    			fputs($fichier,"\n");
     
    			//Vérification que l'avant dernière colonne existe et qu'il n'y en a pas qu'une seule
    			if ($tableau[$num_derniere_colonne] > 1)
    			{
    				$temp_derniere_colonne = $tableau[$num_derniere_colonne-1]; //On stock l'avant dernière colonne dans une variable temporaire pour la comparer par la suite
    			}
     
    			$chemin_sans_dernier_dossier_precedent = $chemin_sans_dernier_dossier;
    		}
    	}
    fclose($fichier);
    Si quelqu'un peut m'aider je lui en serais reconnaissant merci

  2. #2
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    Je me permet de proposer une solution beaucoup plus élégante, et récursive...

    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
    46
    47
    48
    49
    // creer un tableau contenant l'arborecense de ton systeme de fichier
    function Arbrise(&$tab, $str)
    {
    	if(!strlen($str))
    		return false;
     
    	$pos = strpos($str, '/');
     
    	if($pos !== false)
    		$clef = substr($str, 0, $pos);
    	else
    		$clef = $str;
     
    	if(!array_key_exists($clef, $tab))
    		$tab[$clef] = array();
     
    	if($pos !== false)
    		Arbrise($tab[$clef], substr($str, $pos + 1));
    }
     
    // parcours de l'arborecense...
    function ShowTab(&$tab, $niveau)
    {
    	$tmp = '';
    	for($i=0;$i<$niveau;$i++)
    		$tabulation .= "\t"; 
    	foreach($tab as $key => $val)
    	{
    		$tmp .= $tabulation.'<folder>'.$key."\n";
    		$tmp .= ShowTab($val, $niveau+1);	
    		$tmp .= $tabulation."</folder>\n";
    	}
    	return $tmp;
    }
     
     
     
    $tab = array();
    $f = fopen('test.txt', "r"); // ouvre ici ton fichier !
    while($f && !feof($f))
    {
    	$str = trim(fgets($f));
    	if(strlen($str))
    		Arbrise($tab, $str);
    }
     
    // format texte pour pas que le HTML ignore les balises non reconnues
    header('Content-type: text/txt');
    echo ShowTab($tab, 0);
    On a ainsi une structure de stockage temporaire de ton arborescence propre et qui sera restituée tout aussi proprement par une autre fonction récursive.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    Merci "comode" d'avoir passé du temps pour résoudre ma question.
    Ton code est excellent, rapide et sans aucune erreur. , tu es super doué

    Voici le contenu du fichier généré par ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <folder>Dossier1
    	<folder>Dossier2
    		<folder>Dossier3
    		</folder>
    		<folder>Dossier4
    			<folder>Dossier5
    			</folder>
    			<folder>Dossier6
    			</folder>
    		</folder>
    	</folder>
    </folder>
    Je voudrais juste une dernière petite modification et ce sera parfait :
    - Pour les derniers dossier des chemins je voudrais mettre "<file>" au lieu de "<folder>".
    - Puis leur associer leur chemin "<path>"..."</path>"
    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
    <folder>Dossier1
    	<folder>Dossier2
    		<file>Dossier3
    			<path>Dossier1/Dossier2/Dossier3</path>
    		</file>
    		<folder>Dossier4
    			<file>Dossier5
    				<path>Dossier1/Dossier2/Dossier4/Dossier5</path>
    			</file>
    			<file>Dossier6
    				<path>Dossier1/Dossier2/Dossier4/Dossier6</path>
    			</file>
    		</folder>
    	</folder>
    </folder>
    Merci pout tout

  4. #4
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    ShowTab() à remplacer par showtab2() et qui prend un 3e paramètre (chaine vide) :

    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
    function ShowTab2(&$tab, $niveau, $path)
    {
    	for($i=0;$i<$niveau;$i++)
    	$tabulation .= "\t"; 
    	$tmp = '';
    	foreach($tab as $key => $val)
    	{
    		if(count($val) > 0)	
    			$tmp .= $tabulation.'<folder>'.$key."\r\n".ShowTab2($val, $niveau+1, $path.'/'.$key).$tabulation."</folder>\r\n";
    		else
    			$tmp .= $tabulation."<file>".$key."\r\n\t".$tabulation.'<path>'.$path."</path>\r\n".$tabulation."</file>\r\n";
     
    	}
    	return $tmp;
    }
     
    // le str_replace pour pouvoir l'afficher direct en HTML
    echo '<pre>'.str_replace(array('<', '>'), array('&lt;', '&gt;'), ShowTab2($tab, 0, '')).'</pre>';

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    Merci pour cette réponse rapide j'ai intégré le code mais il y a une petite erreur ici : Warning: Invalid argument supplied for foreach() in..

    j'ai fait un "echo ShowTab($tab, 0, '');" pour appeler la fonction

  6. #6
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    il faut que tu laisses $tab initialisé en array() par rapport au précédent code... Et bien sur que tu laisse la partie qui permet de construire la structure de données. Je propose juste une fonction de substitution pour l'affichage de ton arborescence.

    (en gros, tu rajoute la fonction ShowTab2 a l'ancien code et tu remplace juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    header('Content-type: text/txt');
    echo ShowTab($tab, 0);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<pre>'.str_replace(array('<', '>'), array('&lt;', '&gt;'), ShowTab2($tab, 0, '')).'</pre>';
    )

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    Parfait ça fonctionne c'était de ma faute

    Je met résolu excellent travail Comode tu es la meilleur

  8. #8
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    Citation Envoyé par dark snake sw Voir le message
    Parfait ça fonctionne c'était de ma faute

    Je met résolu excellent travail Comode tu es Le meilleur

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    ^^ désolé pour la faute de frappe

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

Discussions similaires

  1. probleme pour recuperer le chemin du dossier courant
    Par HoB dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 11/08/2007, 11h22
  2. [VBA E] explorateur pour obtenir chemin de dossier
    Par gruget dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/02/2007, 14h31
  3. [HTML] prédéfinir le chemin du dossier des images de mon site
    Par cari dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 31/10/2006, 21h58
  4. [.Net 2] Comment récupérer le chemin du dossier du FrameWork .Net ?
    Par FremyCompany dans le forum Framework .NET
    Réponses: 3
    Dernier message: 04/05/2006, 21h08
  5. recuperer le chemin du dossier selectionné ds un JFileChoose
    Par dimitrimm972 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 08/04/2006, 15h57

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