JeuWeb - Crée ton jeu par navigateur
Json_encode : objet ou tableau... - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Json_encode : objet ou tableau... (/showthread.php?tid=1431)



Json_encode : objet ou tableau... - Holy - 13-01-2011

Bonjour,

J'étais en train de réviser quelques scripts php (appelés via AJAX) et je me trouve confronté à un petit soucis ^^ Json_encode() fait un traitement différent selon que les clés du tableau commencent à 0 ou à 15. Lorsque les clés commencent à 0, la fonction vire la clé dans la chaine de sortie et me propose un tableau. Logique en somme, ça permet de gagner encore quelques octets si les clés numériques se suivent. Sauf que... si mes clés commencent à 8 disons, il me sort un objet.

Exemple :
Code :
$a = array(
    0 => array(
        'message' => 'Bonjour'
    ),
    array(
        'message' => 'Salut!'
    )
);
$b = array(
    8 => array(
        'message' => 'Bonjour'
    ),
    array(
        'message' => 'Salut!'
    )
);
echo json_encode($a);
// Donne  [{"message":"Bonjour"},{"message":"Salut!"}]
echo json_encode($b);
// Donne {"8":{"message":"Bonjour"},"9":{"message":"Salut!"}}
Du coup, ça me cause un p'tit soucis niveau traitement javascript. Sauf si je me trompe et qu'il y a moyen de parcourir les deux de la même manière (j'ai essayé de chercher de la bonne doc sur Google et autres, mais c'est pas simple).

Je sais qu'en PHP 5.3 y a moyen de forcer l'encodage pour qu'il sorte de l'objet dans les deux cas (si j'ai bien compris la doc), mais mon serveur ne tourne pas encore sous cette version-là.

Merci pour votre aide,

Holy

Edit : Je vais essayer de passer sous PHP 5.3 histoire de voir ce que ça donne.


RE: Json_encode : objet ou tableau... - Sephi-Chan - 13-01-2011

C'est tout à fait normal. Comme tu ne commence pas au début (à 0), l'index est donné explicitement.
C'est un comportement des tableaux, pas de l'encodage JSON. Smile


Sephi-Chan


RE: Json_encode : objet ou tableau... - atra27 - 13-01-2011

Hum, comment tu fait pour avoir des tableaux qui ne commencent pas a 0?
on peut se dire que le probléme viens de la?

J'avais entendu parler de:
$array = array_values($array);

Pour réindexer un tableau...
Mais je sais pas trop si sa concerne a ton cas...


RE: Json_encode : objet ou tableau... - Sephi-Chan - 13-01-2011

Ben pour créer un tableau qui commence à 8, tu fais :


$b = array(8 => array('message' => 'Bonjour'), array('message' => 'Salut!')

Et effectivement, array_values va de fait réindexer le tableau puisqu'il ne récupère que les valeurs pour créer un tableau avec.


Sephi-Chan


RE: Json_encode : objet ou tableau... - Holy - 13-01-2011

(13-01-2011, 10:11 PM)Sephi-Chan a écrit : C'est tout à fait normal. Comme tu ne commence pas au début (à 0), l'index est donné explicitement.
C'est un comportement des tableaux, pas de l'encodage JSON. Smile


Sephi-Chan
Je vois ^^

En fait, je viens de me rendre compte que j'avais un bug dans mon code javascript et que c'est pour ça qu'il prenait pas bien mon objet json. Je vais corriger ça.

Ah, mais j'ai une dernière question en fait : comment je fais pour parcourir ces deux objets JSon et récupérer les clés correctement ? ^^

Merci Smile
Au temps pour moi, j'ai honte... mais c'est bien mon code javascript qui ne fonctionnait pas. Je vérifiais la longueur de l'objet json en utilisant .length et visiblement ça ne marche pas quand ça n'est pas un tableau ^^

J'ai tout compris et me confonds en excuse xD Un bête for(var key in object) fonctionne parfaitement ^^