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 :

Parser un fichier en une structure de type arbre


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Points : 58
    Points
    58
    Par défaut Parser un fichier en une structure de type arbre
    Bonjour à tous!

    Je peine à transformer un fichier "plat" en une structure de données de type arbre.

    Imaginons une commande tree qui affiche le contenu d'un répertoire de manière récursive sous cette forme:

    +rep1
    |
    |--+ rep1.1
    | |
    | |---+ rep 1.1.1
    | |
    | + rep1.2
    |
    |
    +rep2

    A partir de cette affichage, j'arrive assez facilement à créer un tableau de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $dir = array(
         array("rank"=> 0, "rep"=> "rep1"),
         array("rank"=> 1, "rep"=> "rep1.1"),
         array("rank"=> 2, "rep"=> "rep1.1.1"),
         array("rank"=> 1, "rep"=> "rep1.2"),
         ....
    )
    où rank est ici le nombre de fois où je trouve le caractère '+' afin de hiérarchiser ces répertoires.

    Je me demande quelle est la meilleure manière de traiter ce genre de données si je souhaite créer par la suite un tableau de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $dir = array(
            "rep1" => array(
                    "rep1.1"=>array(
                            ...
                    ),
                    "rep1.2" => array(
                    )
            )...
    J'ai essayé en de la manière suivante mais ça ne fonctionne pas super...

    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
     
    function parse($csv){
    	$z = sizeof($csv);
     
    	$return = array();
     
    	for($i=0;$i<$z;$i++){
     
    		$A = explode(';',$csv[$i]);
    		if(isset($csv[$i-1])){
    			$B = explode(';',$csv[$i-1]);
    			$rank_b = $B[0];
    			$command_b = $B[1];
    		}
    		$rank = $A[0];
    		$command = $A[1];
     
    		if($rank > 1){
    			$return[$rank_b][$command_b][] = array(
    				"command" => $command
    			);
    		} else {
    			$return[$rank][$command] = array(
    				"command" => $command
    			);
    		}
     
    	}
     
    	header('Content-type: application/json');
    	echo json_encode($return);
    }
    Des idées sur la manière de procéder?

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Si j'ai bien compris, ta fonction "parse" récupère le contenu d'un fichier CSV, qui un format du genre :
    0;rep1
    1;rep1.1
    2;rep1.1.2
    0;rep1.2
    Puis tu essaies de transformer ce contenu en un tableau associatif répertoire, style arbre, ou chaque index est le nom du répertoire, et chaque valeur le contenu du répertoire (structure récursive).

    Est ce bien le cas ? Si oui, alors effectivement, ton code ne marchera pas. Difficile de saisir la logique de ton code. Le plus frappant pour moi est au moment où tu ajoutes effectivement un nouvel élément dans ton arbre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if($rank > 1){
    			$return[$rank_b][$command_b][] = array(
    				"command" => $command
    			);
    		} else {
    			$return[$rank][$command] = array(
    				"command" => $command
    			);
    		}
    Ton tableau $return a une "profondeur" potentiellement infinie (autant que tu as de sous-répertoire), or là, tu mets toujours les éléments aux mêmes niveaux. Que signifie l'index "command" ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2008
    Messages : 59
    Points : 58
    Points
    58
    Par défaut
    En effet, je me suis un peu mélangé les pinceaux en adaptant mon code pour l'exemple des "répertoires". Ici, l'index "command" devrait être plutôt "répertoire".
    J'avais le sentiment qu'il fallait cherché du coté des références, et après quelques recherches, j'ai finalement trouvé ce que je cherchais:

    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
     
    	$in = array_map("str_getcsv", explode("\r\n", $csv));
    	foreach ($in as $row) {
    	    list($depth, $rep, $taille) = $row;
     
    	    $r = &$data;  
    	    while ($depth--) {
    	    	end($r); 
    	    	$r = &$r[key($r)]['enfants'];
    	    }
    	    $r[$key] = array(
    	    	'repertoire' => $rep,
    	    	'taille' => $taille
    	    );
    	}
     
    	echo json_encode($r);

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/02/2015, 10h29
  2. Réponses: 8
    Dernier message: 29/03/2014, 23h27
  3. Réponses: 1
    Dernier message: 09/05/2012, 10h39
  4. Utilisation de fichiers avec une structure
    Par showdown dans le forum C
    Réponses: 16
    Dernier message: 07/12/2006, 18h30
  5. [XSLT] Comment utiliser une structure de type if-then-ELSE ?
    Par ribrok dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/11/2006, 12h39

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