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 :

Fichier JSON et PHP


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 131
    Points : 111
    Points
    111
    Par défaut Fichier JSON et PHP
    Bonjour,

    J'ai de nombreuses interrogations concernant la manipulation d'un fichier JSON et PHP, donc voici la 1ere:

    Pour comprendre, j'ai récupéré l'intégralité des valeurs de mon settings.json de vsc, et copier ces dernières dans un nouveau fichier nommé => json.json (Ca c'est pour expliquer d’où viennent les données) !

    Alors voici mon code de lecture des lignes du fichier:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $file = 'json.json'; 
    $data = file_get_contents($file);
    $obj =  json_decode($data, true);
     
    foreach($obj as $objets => $val)
     {    
         echo "Tabs =>  " . $objets . " - Valeur => " . $val ."<br>";
     }

    Ce qui me provoque une erreur à la récupération de sous-tbl. Pouvez vous m'expliquer pourquoi SVP et comment corriger ce premier point ? Merci

    Tabs => php.executablePath - Valeur => C:\Serveur\bin\php\php_8.0.01\php.exe
    Tabs => php.validate.run - Valeur => onType

    Warning: Array to string conversion in F:\DEV_LOCAL\www\servmodif\test_json.php on line 26
    Tabs => alignment.chars - Valeur => Array
    Tabs => liveServer.settings.donotShowInfoMsg - Valeur => 1
    Tabs => liveServer.settings.CustomBrowser - Valeur => firefox
    Tabs => intelephense.telemetry.enabled - Valeur =>
    Tabs => workbench.sideBar.location - Valeur => left
    Tabs => liveServer.settings.donotVerifyTags - Valeur => 1
    Tabs => editor.defaultFormatter - Valeur => esbenp.prettier-vscode

    Warning: Array to string conversion in F:\DEV_LOCAL\www\servmodif\test_json.php on line 26
    Tabs => [html] - Valeur => Array

    Warning: Array to string conversion in F:\DEV_LOCAL\www\servmodif\test_json.php on line 26
    Tabs => [php] - Valeur => Array
    Tabs => phpformatter.composer - Valeur => 1
    Tabs => phpserver.phpConfigPath - Valeur => C:\Serveur\bin\php\php_8.0.02
    Tabs => editor.renderControlCharacters - Valeur => 1
    Tabs => explorer.confirmDragAndDrop - Valeur =>

    Warning: Array to string conversion in F:\DEV_LOCAL\www\servmodif\test_json.php on line 26
    Tabs => liveSassCompile.settings.autoprefix - Valeur => Array
    Tabs => liveSassCompile.settings.generateMap - Valeur =>

    Warning: Array to string conversion in F:\DEV_LOCAL\www\servmodif\test_json.php on line 26
    Tabs => liveSassCompile.settings.formats - Valeur => Array

  2. #2
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 785
    Points : 3 048
    Points
    3 048
    Par défaut
    Bonjour

    Citation Envoyé par gesualda Voir le message
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $obj =  json_decode($data, true);
    As-tu pris le temps de lire ce que fait le second paramètre true de ta fonction?

    Réponse ici : https://www.php.net/manual/en/function.json-decode.php

    "When true, JSON objects will be returned as associative arrays;" --> du coup, c'est un array que tu reçois, pas un objet.

  3. #3
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 131
    Points : 111
    Points
    111
    Par défaut
    Bonjour Christophe,

    Merci de ce retour, mais en effet, j'avais vu mais pas saisi. j'avais tenté avant mon POST avec "false" et également en y rajoutant un flag => JSON_OBJECT_AS_ARRAY.
    Bon visiblement j'ai pas compris ce qu'il y avait à faire.

  4. #4
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 131
    Points : 111
    Points
    111
    Par défaut
    Bonjour à tous,

    Alors j'ai toujours pas trouvé comment sortir de mon erreur.
    J'ai bien compris qu'il y avait des tbl imbriqués dans le premier, mais j'ai pas trop compris comment mon sortir.

    Peut etre un conseil. ?

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 332
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 332
    Points : 15 676
    Points
    15 676
    Par défaut
    regardez votre variable avec la fonction suivante pour voir la structure complète :
    https://www.php.net/manual/fr/function.var-dump.php

  6. #6
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 131
    Points : 111
    Points
    111
    Par défaut
    Bonjour Mathieu,

    J'ai contrôle la structure mais je ne trouve pas comment afficher les valeurs sans l'erreur.

    Code PHP : 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
    33
    34
    35
    36
    37
    38
    array (size=18)
      'php.executablePath' => string 'C:\Serveur\bin\php\php_8.0.25\php.exe' (length=37)
      'php.validate.run' => string 'onType' (length=6)
      'alignment.chars' => 
        array (size=0)
          empty
      'liveServer.settings.donotShowInfoMsg' => boolean true
      'liveServer.settings.CustomBrowser' => string 'firefox' (length=7)
      'intelephense.telemetry.enabled' => boolean false
      'workbench.sideBar.location' => string 'left' (length=4)
      'liveServer.settings.donotVerifyTags' => boolean true
      'editor.defaultFormatter' => string 'esbenp.prettier-vscode' (length=22)
      '[html]' => 
        array (size=1)
          'editor.defaultFormatter' => string 'vscode.html-language-features' (length=29)
      '[php]' => 
        array (size=1)
          'editor.defaultFormatter' => string 'bmewburn.vscode-intelephense-client' (length=35)
      'phpformatter.composer' => boolean true
      'phpserver.phpConfigPath' => string 'C:\Serveur\bin\php\php_8.0.25' (length=29)
      'editor.renderControlCharacters' => boolean true
      'explorer.confirmDragAndDrop' => boolean false
      'liveSassCompile.settings.autoprefix' => 
        array (size=0)
          empty
      'liveSassCompile.settings.generateMap' => boolean false
      'liveSassCompile.settings.formats' => 
        array (size=2)
          0 => 
            array (size=3)
              'format' => string 'expanded' (length=8)
              'extensionName' => string '.css' (length=4)
              'savePath' => string '~/../css' (length=8)
          1 => 
            array (size=3)
              'format' => string 'compressed' (length=10)
              'extensionName' => string '.min.css' (length=8)
              'savePath' => string '~/../css/min' (length=12)

    J'ai tenté d'afficher les sous tableaux, mais je pense que j'ai perdu le fil. C'est toujours tout en erreur.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach ($obj as $tbl_01 => $key_01)  {   
     
        echo 'Elements : ' . $tbl_01 . '<br>';
     
        foreach($key_01 as $tbl_02 => $key_02){
            echo $tbl_02 . ' : ' . $tbl_02 . '<br>';
        }
    }

  7. #7
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 785
    Points : 3 048
    Points
    3 048
    Par défaut Quel est ton besoin ?
    Tu as un fichier json, tu l'as converti en un tableau associatif et maintenant, pour qu'on t'aide correctement, que veux-tu ? Une valeur précise ?

    Comme tu le verras avec ton dump, ton tableau contient d'autres tableaux. Et c'est la ta difficulté.

  8. #8
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 131
    Points : 111
    Points
    111
    Par défaut
    Bonjour Christophe,

    Ce que je voulais c'est dans un premier temps comprendre pourquoi l'erreur:
    Warning: Array to string conversion in
    Et en effet, comment extraire une chaine du tableau pour la modifier. Merci

  9. #9
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 785
    Points : 3 048
    Points
    3 048
    Par défaut
    Hello

    Relis ma dernière phrase, je réponds déjà à ta question.

    Tu as un tableau qui contient des tableaux. Et quand tu tentes ton affichage, tu présumes que ta valeur est une chaîne de caractères et bardaf...

    Tu pourrais vérifier le type de données avec is_array si tu souhaitais poursuivre ton exploration.

    On pourrait imaginer une fonction récursive pour ton affichage mais c'est peut-être une grosse artillerie si ton souhait est juste de "jouer" et d'afficher tes settings.

  10. #10
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 785
    Points : 3 048
    Points
    3 048
    Par défaut
    Je viens rapido de passer derrière le pc pour vite écrire un code et json_decode(file_get_contents("settings.json"),true) n'aime pas trop mon fichier settings.json de vscode. Je n'ai pas creusé le pourquoi mais j'ai pris une portion de mon fichier:

    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
    33
    34
    35
    36
    37
    38
    {
        "am-i-behind.notificationLevel": "error",
        "breadcrumbs.enabled": true,
        "code-runner.clearPreviousOutput": true,
        "code-runner.defaultLanguage": "php",
        "code-runner.enableAppInsights": false,
        "code-runner.fileDirectoryAsCwd": true,
        "cSpell.enableFiletypes": [
            "!json",
            "!php",
            "!twig",
            "!yml",
            "!.php_cs",
            "markdown",
            "plaintext",
            "text"
        ],
        "debug.console.historySuggestions": false,
        "debug.inlineValues": true,
        "debug.internalConsoleOptions": "neverOpen",
        "debug.openDebug": "neverOpen",
        "editor.codeActionsOnSave": {
            "source.fixAll": true
        },
        "editor.detectIndentation": false,
        "editor.fontSize": 18,
        "editor.formatOnPaste": false,
        "editor.formatOnType": true,
        "editor.insertSpaces": true,
        "editor.multiCursorModifier": "ctrlCmd",
        "editor.guides.indentation": true,
        "editor.renderWhitespace": "all",
        "editor.guides.highlightActiveIndentation": true,
        "editor.rulers": [
            120,
            70
        ]
    }
    Voici mon code PHP:

    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
    33
    <?php
    function displaySettings(array $arrSettings, string $content = ''): string
    {
        foreach ($arrSettings as $key => $value) {
            if (is_array($value)) {
                $content.=displaySettings($value, '');
            } else {
                $content .=
                    '<strong>'.$key.'</strong>:&nbsp;'.
                    '<span style="color:green;">'.(string) $value.'</span>'.
                    '<br/>';
            }
        }
     
        return '<blockquote>'.$content.'</blockquote>';
    }
     
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
     
    try {
        $arrJson=json_decode(
            (string) file_get_contents(__DIR__.'/settings.json'),
            true,
            512,
            JSON_THROW_ON_ERROR
        );
     
        echo "<html><body>".displaySettings($arrJson)."</body></html>";
    } catch (JsonException $e) {
        print_r($e->getMessage());
    }
    Il s'agit donc d'une fonction récursive.

    Et voici l'output à l'écran :

    Nom : 2022-11-17_20h35_08.png
Affichages : 441
Taille : 35,7 Ko

    On voit bien que lorsque la fonction trouve un array, elle s'est appelée elle-même. Cela se voit à l'indentation.

  11. #11
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 131
    Points : 111
    Points
    111
    Par défaut
    Ca c'est super ! je vais regardé cela demain pour comprendre et je reviendrai dire quoi !

    json_decode(file_get_contents("settings.json"),true) n'aime pas trop mon fichier settings.json
    Pour le fichier settings.json de VSC, j'ai également eu le même soucis.
    J'ai supprimé les commentaires dans le fichier et tout est rentré dans l'ordre. Peut etre un bug.

    Merci

  12. #12
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 131
    Points : 111
    Points
    111
    Par défaut
    Hello Christophe,

    Alors j'ai regardé et compris (plus ou moins) ce que signifiait => la récursivité en PHP.
    Pour faire court, cela refais une boucle mais en gardant la valeur de départ.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $content.=displaySettings($value, '');

    Du coup, j'ai également lu le tuto et explication => ici ou meme la . Il y en a d'autres bien sur !

    Si tu as un moment, j'essaye de comprendre l'intitulé de ta fonction:

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    function displaySettings(array $arrSettings, string $content = ''): string
    Ce que je comprends pas bien c'est pourquoi le rajout de "array" et "string" devant les variables et surtout les : string après l'accolade !

    Je pense que array $arrSettings c'est pour mettre le contenu en tableau, mais "string $content = ''): string"

    Pardon de mes questions, mais c'est juste pour ma compréhension personnelle, rien de plus !
    Merci de ta patience.

  13. #13
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 785
    Points : 3 048
    Points
    3 048
    Par défaut
    Ben ... Tu écris php 8.1 dans ta signature ;-)

    PHP évolue toujours plus vers un langage typé. Avant, avec PHP 4 et PHP 5, on pouvait coder médiocre; vraiment beurk beurk beurk.

    Avec PHP 7 encore... Tu peux dire $age=18 puis plus loin $age='Jacques'; euh ? Tu vois le souci forcément.

    Si je dis que $age est un integer; là, bardaf, PHP et, aussi, vscode vont râler et c'est cool qu'ils rouspètent puisque je code comme un pied.

    Le fait de typer les variables gomme une partie des erreurs invisibles; celles qui sont le pire à déboguer.

    Une variable que je déclare comme array, si je tente de faire autre chose que de l'utiliser comme un tableau, bardaf, Christophe tu fais du médiocre.

    Voilà pourquoi depuis PHP 7.x et encore plus depuis PHP 8, il faut typer les variables.

    Donc je définis mon premier paramètre comme devant être un tableau, le second comme devant être une chaîne de caractères que j'initialise à une chaîne vide au début et je déclare que ma fonction doit retourner une chaîne de caractères. Si la fonction retourne n'importe quoi d'autre; bardaf, erreur.

    (et tu le comprends, plus d'erreur on a lors de la programmation, au mieux c'est car ce sont des bugs qu'on n'aura pas à l'exécution)

  14. #14
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 131
    Points : 111
    Points
    111
    Par défaut
    Merci Christophe,

    Je comprends mieux. Cela force la variable à passer soit en string, int ou autre en fonction de la déclaration.
    Merci de ces échanges. Je ferme pas le ticket pour l'instant.

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/04/2018, 12h47
  2. Traiter les informations d'un fichier JSON dans PHP
    Par fabio1978 dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2017, 16h59
  3. fichier json et php [site d'annonces]
    Par olivxii dans le forum Langage
    Réponses: 8
    Dernier message: 30/01/2015, 15h55
  4. Réponses: 0
    Dernier message: 04/03/2014, 15h23
  5. Création de fichier json avec PHP
    Par versus68 dans le forum Langage
    Réponses: 1
    Dernier message: 02/06/2008, 11h56

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