Générer du JSON en PHP [Fermé]

Signaler
Messages postés
150
Date d'inscription
jeudi 25 octobre 2012
Statut
Membre
Dernière intervention
15 novembre 2015
-
Sunr
Messages postés
122
Date d'inscription
dimanche 12 janvier 2014
Statut
Membre
Dernière intervention
24 novembre 2015
-
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"}

2 réponses

Messages postés
122
Date d'inscription
dimanche 12 janvier 2014
Statut
Membre
Dernière intervention
24 novembre 2015
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);
xxxinconitoxxx
Messages postés
150
Date d'inscription
jeudi 25 octobre 2012
Statut
Membre
Dernière intervention
15 novembre 2015
81
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 :/
Sunr
Messages postés
122
Date d'inscription
dimanche 12 janvier 2014
Statut
Membre
Dernière intervention
24 novembre 2015
20
ouais tu as absolument raison! =p
hmm je tenterai de t'aider dès que je peux de nouveau! ;)
xxxinconitoxxx
Messages postés
150
Date d'inscription
jeudi 25 octobre 2012
Statut
Membre
Dernière intervention
15 novembre 2015
81 > Sunr
Messages postés
122
Date d'inscription
dimanche 12 janvier 2014
Statut
Membre
Dernière intervention
24 novembre 2015

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
xxxinconitoxxx
Messages postés
150
Date d'inscription
jeudi 25 octobre 2012
Statut
Membre
Dernière intervention
15 novembre 2015
81
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)
Messages postés
122
Date d'inscription
dimanche 12 janvier 2014
Statut
Membre
Dernière intervention
24 novembre 2015
20
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);
	}