Générer du JSON en PHP

Fermé
xxxinconitoxxx Messages postés 151 Date d'inscription jeudi 25 octobre 2012 Statut Membre Dernière intervention 15 novembre 2015 - Modifié par xxxinconitoxxx le 28/10/2015 à 19:27
 Utilisateur anonyme - 10 nov. 2015 à 00:32
Bonjour,

je voudrais créer "ce format" (voir code 1) de JSON en php depuis une fonction qui liste tous les fichiers contenu dans un dossier (et sous dossier) (voir code 2).

Je sais que pour réaliser ceci il me faut un tableau où je regroupe tous les fichiers trouvés mais je ne sais pas trop comment faire, je m'exprime peut être mal donc je vais schématiser tous sa :

1 - On liste "dossier1" :
- C'est un fichier, alors on l'ajoute au tableau
- C'est un dossier, alors on le liste donc on recommence la boucle
2 - On exécute "json_encode" sur le tableau
3 - On "echo" le "json_encode"

Le problème c'est que je ne sait pas comment créer ce tableau ...

Code 1 :
{
"fichier1": {
"path": "dossier1",
"time": "20/10/2015 10:57:42"
},
"fichier2": {
"path": "dossier/2015",
"time": "20/10/2015 10:57:42"
}
}


Code 2 :
mcData('MinecraftResources');

function mcData($dirName)
{ 
 $dir = opendir($dirName);
   
 while ($file = readdir($dir))
 {
  if(($file != '.') && ($file != '..'))
  {
      if (is_dir($dirName.'/'.$file))
      {
      mcData($dirName.'/'.$file);
      }
      else
      {
    //Création du json ici ----->
   $fileTime = date("d/m/Y H:i:s", filemtime($dirName.'/'.$file));
   $mcArray = array(
           'path' => $dirName,
           'time' => $fileTime
      );
   echo json_encode($mcArray);
   // <-----
      }
  }
 }
 closedir($dir);
}


Ce que j'obtient actuellement :
{"path":"MinecraftResources","time":"21\/10\/2015 12:29:23"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:24"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:28"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:28"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:28"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:27"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:27"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:24"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:26"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:26"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:25"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:25"}{"path":"MinecraftResources\/mods","time":"21\/10\/2015 12:29:25"}{"path":"MinecraftResources","time":"21\/10\/2015 12:29:19"}{"path":"MinecraftResources","time":"21\/10\/2015 12:29:28"}{"path":"MinecraftResources\/versions\/1.8.8","time":"21\/10\/2015 12:29:32"}{"path":"MinecraftResources\/versions\/1.8.8","time":"21\/10\/2015 12:29:28"}
A voir également:

2 réponses

Utilisateur anonyme
28 oct. 2015 à 21:20
Bah, il y a deux problèmes. le premier étant que tu crées un nouvel array $mcArray et que tu lui appliques json_encode dans la boucle, ce qui te renvoie ainsi un tableau pour chaque fichier trouvé. Ce que tu obtients est donc plusieurs tableaux, soit un par ligne dans ton exemple. Ensuite, tu dois créer un tableau multidimensionnel dont la première valeur est un autre tableau possédant le nom du fichier comme clé. Le deuxième tableau détiendra ses informations. Ce bout de code t'aide un peu?

   //Création du json ici ----->
   $fileTime = date("d/m/Y H:i:s", filemtime($dirName.'/'.$file));
   //Les crochets [] ont le même
   //effet que array_push. Il faut
   //empiler tous les fichiers dans
   //un énorme tableau, et puis
   //ensuite l'encoder.
   $mcArray[$dirName.'/'.$file] =  array(
	'path' => $dirName,
	'time' => $fileTime
	);
      }
  }
 }
 closedir($dir);
//Maintenant, json_encode est à l'extérieur
//de la boucle, il ne sera appliqué ainsi qu'un seule
//fois, lorsque le tableau détiendra tous les fichiers.
echo json_encode($mcArray);
0
xxxinconitoxxx Messages postés 151 Date d'inscription jeudi 25 octobre 2012 Statut Membre Dernière intervention 15 novembre 2015 165
29 oct. 2015 à 21:00
Merci de m'avoir répondu et j'avais compris le principe du tableau qui était créer à chaque boucle. Le problème maintenance c'est que, comme il y a plusieurs sous dossiers, la fonction est appeler plusieurs fois (à cette ligne
mcData($dirName.'/'.$file);
) donc ll'echo est fait plusieurs fois, je ne peut pas executer l'echo hors de la fonction donc je sait pas trop la :/
0
Utilisateur anonyme
30 oct. 2015 à 20:22
ouais tu as absolument raison! =p
hmm je tenterai de t'aider dès que je peux de nouveau! ;)
0
xxxinconitoxxx Messages postés 151 Date d'inscription jeudi 25 octobre 2012 Statut Membre Dernière intervention 15 novembre 2015 165 > Utilisateur anonyme
7 nov. 2015 à 11:07
Bon bas je trouve pas vraiment ce que je cherche, j'ai chercher pendant pas mal de temps mais sans résultat, donc si tu as la réponse je suis preneur ! :P
0
xxxinconitoxxx Messages postés 151 Date d'inscription jeudi 25 octobre 2012 Statut Membre Dernière intervention 15 novembre 2015 165
30 oct. 2015 à 21:27
Merci, je vais essayez de chercher de moi même (c'est le meilleur moyen de progresser :p) mais je suis quand même là pour écouter toutes les solutions parce que là je sais pas trop x)
0
Utilisateur anonyme
10 nov. 2015 à 00:32
Bon, alors prise 2! Certains ont publié leur code sur le net, alors eh bah je m'en suis quelque peu inspiré. En souhaitant que ça fonctionne cette fois! Bon courage pour la suite, =?

function mcData($mainDir) {
	$mcArray = array();
	$directories = array($mainDir);
	//Tant que l'array $directories n'est pas vide.
	while (null !== ($dir = array_pop($directories))) {
		if ($dh = opendir($dir)) {
			//Ici, on rajoute false !==, parce qu'il me semble sinon qu'un fichier ou un dossier appelé 0 (soit false!) pourrait mettre fin à la boucle!
			while (false !== ($file = readdir($dh))) {
				if (($file != '.') && ($file != '..')) {
					$path = "$dir/$file";
					if (is_dir($path)) $directories[] = $path;
					else $mcArray[$path] =  array(
						'path' => $dir,
						'time' => date("d/m/Y H:i:s", filemtime($path))
						);	
					}
				} closedir($dh);
			}
		} return json_encode($mcArray);
	}
0