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 :

Encoder un tableau PHP en JSON qui contient des fonctions JS


Sujet :

Langage PHP

  1. #1
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut Encoder un tableau PHP en JSON qui contient des fonctions JS
    Hello !

    J'ai un ptit problème, j'ai un tableau php à encoder en json :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $array = array(
        'column' => array(
            'stacking' => 'normal',
            'dataLabels' => array(
                'enabled' => true,
                'formatter' => "function() {       if(this.y != 0) {                  return this.y;            }        }",
                'color' => "red",
                'style' => array(
                    'textShadow' => '0 0 3px black, 0 0 3px black'
                )
            ),
        )
    );
    Comme vous pouvez le voir, j'ai une fonction js qui se trouve dans ce tableau (à l'index colum->dataLabels->formatter).

    Or quand on utilise la fonction json_encode de but, on obtient ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "formatter":"function() {            if(this.y != 0) {                  return this.y;            }        }",
    C'est une chaîne de caractère (et c'est tout à fait logique), mais moi ce que je voudrais, c'est qu'il n'y est pas les guillemets pour que "formatter" soit bien une fonction.

    Bon. Très bien. Le truc c'est que c'est pas possible, et les quelques solutions proposées ne me conviennent pas. J'ai bien quelques idées sous le coude, mais toutes me paraissent plus grade les unes que les autres.

    D'où ma question : comment feriez-vous ?

    Merci d'avance !
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Moi j'utiliserai un système de placeholders.
    1. Tu parcours le tableau à la recherche des fonctions. Ici j'utilise array_walk_recursive() mais si tu sais déjà où se trouvent les fonctions dans l'arborescence, c'est encore plus facile, un simple foreach devrait être suffisant.
    2. Dans la boucle tu remplaces les fonctions par un placeholder (qui ne peut pas prêter à confusion) en ayant préalablement stocké le contenu de l'item dans un tableau.
    3. Tu encodes en json.
    4. Tu remplaces les placeholders par %s pour obtenir une chaîne formatée.
    5. Reste à exploiter la chaîne formatée et le tableau avec vsprintf() pour obtenir le résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    define('PLACE_HOLDER', 'Olga aime les asperges');
    $functions = array();
     
    array_walk_recursive($array, function (&$item) use (&$functions) {
    	if (strpos($item, 'function')===0) {
    		$functions[] = $item;
    		$item = PLACE_HOLDER;
    	} 
    });
     
    $str = json_encode($array);
    $str = strtr($str, array('"' . PLACE_HOLDER . '"' => '%s'));
     
    $result = vsprintf($str, $functions);
    Précautions:
    Attention, array_walk_recursive modifie le tableau. Donc si tu veux le préserver, il faut travailler sur une copie.
    Si pour une raison ou une autre le tableau devait contenir la chaîne %s parmi ses valeurs ou ses clefs, il faudrait alors les protéger en les remplaçant par autre chose le temps d'appliquer le vsprintf(). On peut le faire dans la foulé avec le strtr():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $str = strtr($str, array('%s' => TEMP,  '"' . PLACE_HOLDER . '"' => '%s'));
    $str = vsprintf($str, $functions);
    $result = strtr($str, array(TEMP => '%s'));
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Pas mal, j'adopte !
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jquery et objet Json qui contient du HTML
    Par paintbox dans le forum ASP.NET
    Réponses: 0
    Dernier message: 09/10/2014, 22h38
  2. comment parser un fichier csv qui contient des ligne en json
    Par khadi8 dans le forum Général Python
    Réponses: 4
    Dernier message: 07/02/2014, 21h07
  3. Le tri d'un tableau qui contient des input text
    Par haylox dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/03/2013, 12h47
  4. Réponses: 1
    Dernier message: 28/12/2007, 12h14
  5. Afficher sous Word des données SQL qui contient des retours
    Par samoht dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 30/09/2005, 16h12

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