Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2012, 18h26   #1
Nouveau Membre du Club
 
François
Inscription : mars 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : François
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 : 25
Points : 25
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 :
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 :
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 :
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?
franquis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 19h20   #2
Membre confirmé
 
Homme Clément
Développeur informatique
Inscription : décembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2006
Messages : 213
Points : 277
Points : 277
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 :
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" ?
Climoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 00h52   #3
Nouveau Membre du Club
 
François
Inscription : mars 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : François
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 : 25
Points : 25
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 :
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);
franquis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h24.


 
 
 
 
Partenaires

Hébergement Web