8768 sujets

Développement web côté serveur, CMS

Bonjour j'ai une question je développe une application web et j'ai besoin de stocker un nom et une coordonnée dans un fichier json.

La structure de mon json que j'aimerais avoir :

{
   "schema_1":[
      {
         "nom_objet":"cercle1",
         "matrice":"matrix(1 0 0 1 497 75)"
      },
      {
         "nom_objet":"cercle2",
         "matrice":"matrix(1 0 0 1 497 130)"
      }
   ],
   "schema_2":[
      {
         "nom_objet":"cercle1",
         "matrice":"matrix(1 0 0 1 300 75)"
      },
      {
         "nom_objet":"cercle2",
         "matrice":"matrix(1 0 0 1 300 130)"
      }
   ]
}


Mon problème c'est que je n'arrive pas à bien structuré mes données quand je l'ai mes dans un json... Smiley decu

Je vous montre comment j'ai coder ca : (php)

$s_file = "stockage.json";

     try {
         // On essayes de récupérer le contenu existant
         $s_fileData = file_get_contents($s_file);

         if( !$s_fileData || strlen($s_fileData) == 0 ) {
             // On crée le tableau JSON
             $tableau_pour_json = array();
         } else {
             // On récupère le JSON dans un tableau PHP
             $tableau_pour_json = json_decode($s_fileData, true);
         }

         // On ajoute le nouvel élement
         foreach ($table_objet as $value) {
           array_push( $tableau_pour_json, array(
               'nom_objet' => $value[0],
               'matrice' => $value[1]
           ));
         }

         // On réencode en JSON
         $contenu_json = json_encode($tableau_pour_json);

         // On stocke tout le JSON
         file_put_contents($s_file, $contenu_json,JSON_FORCE_OBJECT);

         echo "Vos informations ont été enregistrées";
     }


Ce que j'obtiens dans mon json :

[
  {
    "nom_objet": "cercle1",
    "matrice": "matrix(1 0 0 1 497 75)"
  }, {
    "nom_objet": "cercle2",
    "matrice": "matrix(1 0 0 1 497 130)"
  }
]


c'est à peu près bon mais il me manque le nom de l'objet "nom_objet":[{...}]

Avez vous une idée ?
Merci d'avance ! Smiley ravi
Modifié par eventdark (27 Apr 2020 - 18:56)
Salut !

Il te suffit de rajouter une clé pour chaque élément dans ton foreach, avec un incrément pour avoir le bon nom d'objet comme ceci :


// L'incrément pour le nom de ta clé en schema_
$increment = 1;
foreach ($tableau_objet as $value) {

    // Équivalent à array_push($tableau_pour_json['schema_'.$increment, data...);
    // Mais en plus rapide
    $tableau_pour_json["schema_{$increment}"] = [
        'nom_objet' => $value[0],
        'matrice' => $value[1]
    ];

    // On augmente sa valeur pour la prochaine clé
    $increment++;
}


Ou si ton tableau à des clés qui sont des integers tu peux aussi faire comme ça :


foreach ($tableau_objet as $i => $value) {
    $tableau_pour_json["schema_{$i}"] = [
        'nom_objet' => $value[0],
        'matrice' => $value[1]
    ];
}


Du coup plus besoin d'incrément Smiley smile

Pour assigner de nouvelles valeurs à un tableau, mieux vaut utiliser
$tonTableau[] = 'Nouvelle valeur';

plutot que
array_push($tonTableau, 'Nouvelle valeur');

car c'est plus rapide Smiley cligne (look ici pour des benchmarks)
Modifié par Wazazaby (27 Apr 2020 - 22:35)
Merci pour ta réponse ! J'ai bien compris comment ça fonctionner j'ai modifier ton code pour l'arranger comme je voulais j'ai pue obtenir ça :
{
  "schema": [{
    "nom_objet": "cercle1",
    "matrice": "matrix(1 0 0 1 497 75)"
  }, {
    "nom_objet": "cercle2",
    "matrice": "matrix(1 0 0 1 497 130)"
  }],
  "schema_1": [{
    "nom_objet": "cercle3",
    "matrice": "matrix(1 0 0 1 497 75)"
  }, {
    "nom_objet": "cercle4",
    "matrice": "matrix(1 0 0 1 497 130)"
  }]
}


Avec ce code :

$table_objet = [
       ['cercle3', "matrix(1 0 0 1 497 75)"],
       ["cercle4", "matrix(1 0 0 1 497 130)"]
     ];

     // encoder dans le json
     $s_file = "stockage.json";
     $tab_tempo = [];

     try {
         // On essayes de récupérer le contenu existant
         $s_fileData = file_get_contents($s_file);

         if( !$s_fileData || strlen($s_fileData) == 0 ) {
             // On crée le tableau JSON
             $tableau_pour_json = array();
         } else {
             // On récupère le JSON dans un tableau PHP
             $tableau_pour_json = json_decode($s_fileData, true);
         }

         // On ajoute le nouvel élement
          foreach ($table_objet as $key => $value) {
            $tab_tempo[$key] = [
              'nom_objet' => $value[0],
              'matrice' => $value[1]
            ];
          }
          $tableau_pour_json["schema_1"] = $tab_tempo;
         // On réencode en JSON
         $contenu_json = json_encode($tableau_pour_json);

         // On stocke tout le JSON
         file_put_contents($s_file, $contenu_json,JSON_FORCE_OBJECT);

         echo "Vos informations ont été enregistrées";
     }
     catch( Exception $e ) {
         echo "Erreur : ".$e->getMessage();
     }

Bonne soirée !
Modifié par eventdark (28 Apr 2020 - 09:16)
Meilleure solution