Problème création de tableau associatif de facon récursive [Résolu]

Signaler
Messages postés
8
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
8 août 2008
-
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
-
Bonjour,

je souhaite lire un xml et générer un tableau a partir des données de ce-dernier. Je souhaite créer mon tableau de la facon suivante:
tab[nom de l'attribut]=value de l'attribut
tab[nom du noeud]= tableau contenant :  tab[nom de l'attribut]=value de l'attribut ....

Je veux donc créer un tableau associatif comme en php avec toutes mes valeurs, j'ai donc fait le code suivant, et j'ai testé :

function xml2tab(xml){//prend un objet xml et un tableau et remplis ce-dernier a partir du xml

    var tableau = new Array();

    if (xml.hasAttributes()){//si le noeud a des attributs
        ligne += "il y a "+xml.attributes.length+" attributes
";
        for (i = 0; i < xml.attributes.length; i++) {//pour tout les attributs on les met dans le tableau
            ligne += "&amp;nbsp;&amp;nbsp;attribut "+i+" |"+xml.attributes[i].nodeName+" : "+xml.attributes[i].nodeValue+"
";
             tableau[xml.attributes[i].nodeName] = xml.attributes[i].nodeValue;
        }
    }
    if (xml.hasChildNodes()) {//si le noeud a des "enfants"
        ligne += "il y a "+xml.childNodes.length+" childNodes
";
        var tab_tmp2 = new Array();
        for (j = 0; j < xml.childNodes.length; j++) {
        //pour tous les enfants on crée un tableau contenant le tableau généré par la fonction xml2tab avec chaque enfant de l'objet xml de depart 
            ligne += "childnode "+j+" : "+xml.childNodes[j].nodeName+"
";
            tableau[xml.childNodes[j].nodeName] = new Array();
            tableau[xml.childNodes[j].nodeName] = xml2tab(xml.childNodes[j]);
            ligne += "childnode "+j+" terminé
";
        }    
    }

    return tableau;
}



Le tableau de retour pour chaque appel est correctement formé avec les
bonnes valeurs, mais le tableau général renvoyé ne comporte que les
attributs et après toutes les autres "cases" sont bien crées, mais contiennent undefined.

Merci d'avance

10 réponses

Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
aurais-je compris ce que tu veux faire ?
des tableaux associatifs multi-dimensionnels ?

<script>

function toto()
   {   var tableau=new Array();
        var nom=["un","deux","trois"];
        var tab1=new Array("1","2","3");
        for ( i = 0; i < nom.length; i++ )
        {   tableau[nom[i]] = tab1;
        }  
        return tableau;
   }
   
   var tmp=toto();
   for ( var i in tmp )
   {        for ( var j in tmp[i] )
            {        alert ( i + "\t" + tmp[i][j] );    }
   }

     tmp["deux"]["2"]="toto";
     alert(tmp["deux"]["2"]);
     
</script>

pour l'exemple c'est toujours le même, mais bon...

          Cordialement     Bul   [mon Site]  [M'écrire], <!--
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
bonjour,
tu creé un array que tu n'utilises pas ?
             tableau[xml.childNodes[j].nodeName] = new Array();
            tableau[xml.childNodes[j].nodeName] = xml2tab(xml.childNodes[j]);

ch'tiot exemple, tu adapteras :
  var tableau=new Array();

  var nom=["un","deux","trois"];

  for (j = 0; j < nom.length; j++)

      {   tableau[nom[j]] = new Array();

          tableau[nom[j]][0] = j;

      }

    for ( j in tableau )

    {    alert(j+"="+tableau[j][0]);    }

 
   
          Cordialement        Bul   [mon Site]  [M'écrire], <!--
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
une question néanmoins me turlupine ... pourquoi passer par un tableau ?
au fond,  cela en est un ... non ?
          Cordialement    Bul   [mon Site] [M'écrire], <!--
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
il fallait lire : au fond,  le xml en est un ... non ?
           Cordialement    Bul   [mon Site] [M'écrire], <!--
Messages postés
8
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
8 août 2008

Ben en fait, c'est pour une sérialisation de données entre mon php, et mon javascript en ajax, je charge un flux xml en ajax, j'ai une fonction que j'ai fait en php qui me transforme n'importe quel tableau en xml, maintenant je voudrais faire l'opération inverse pour récupérer mon tableau et pouvoir accéder simplement à mes données en faisant tab['...']['....'].
Et oui, le xml, au fond c'est un tableau, mais j'aurais souhaité ne pas me servir des fonctions xml (plus longues a écrire et que mes collègues maitrisent moins) pour accéder à toutes mes données.
De plus si j'utilise une fonction avec un for pour parser tout mon tableau, étant donné qu'on est en récursif, je ne sait pas ou je suis par rapport au tableau d'origine, dans quel sous tableau, et ma fonction xml2tab me retourne un tableau déjà multidimensionnel ....
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
ce n'était qu'une question....
j'en aurais bien d'autres ( pourquoi pas coté php ? pourquoi ajax sur du xml  ? .. )
mais bon ce serait assez stérile, et je risquerais de paraître ch%$¤*.
bref, je pense qu'on n'a pas assez de billes... ne serait-ce que pour tester

car si j'applique ce que tu exemples à mon exemple :

    function toto()
    {    var tableau=new Array();
        var nom=["un","deux","trois"];
        var tab2=new Array();
        for (j = 0; j < nom.length; j++)
        {   tableau[nom[j]] = new Array();
            tab2.push((j+1)*10);      // pour simuler xml2tab
            tab2.push((j+1)*100);
            tab2.push((j+1)*1000);
            tableau[nom[j]] = tab2;
        }   
        return tableau;
    }
    var tmp=toto();
    for ( var i in tmp )
    {    alert(i+"="+tmp[i]);    }

les for ne sont qu'en exemple, pour le test, "pour simplifier",
ça ne change rien au "principe"

pas de raisons que cela ne fonctionne pas,
il faudrait cerner le souci un peu plus,
difficile de tester avec l'extrait donné.

     Cordialement   Bul  [mon Site] [M'écrire], <!--
Messages postés
8
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
8 août 2008

Ben en fait j'utilise le xml, parceque je veux de l'ajax et que c'est ce que je connait le plus, maintenant si ya d'autre moyen plus simples ou rapide, je veux bien, et vas-y ne te gene pas pour les questions, si ca me permet de découvrir plus de choses....

Pour ton exemple je veux bien, je comprend bien, mais quand il s'agit de tableau associatifs, ca me parait plus complexe .... ca ne marche pas, enfin je n'y arrive pas, en faisant ca :

    var table=new Array();
    var table1=new Array();
    var table2=new Array();
    table1["pok1"]="pokke1";
    table1["pok2"]="pokke2";
    table1["pok3"]="pokke3";
    table2["pwet1"]="pwette1";
    table2["pwet2"]="pwette2";
    table2["pwet3"]="pwette3";

    table["pok"] = new Array();
    table["pwet"] = new Array();
    table["pok"] = table1;
    table["pwet"] = table2;
   

Et pour parcourir un tableau multidimentionnel
Messages postés
8
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
8 août 2008

oops dsl, oui, pour parcourir un tableau multidimentionnel, je trouve que c'est plus simple en récursif qu'en itératif, c'est ce que je voulais dire avec les for.
Messages postés
8
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
8 août 2008

Désolé, merci beaucoup, je me suis appercu que ma fonction marche très bien, mais que je me suis planté dans la fonction d'affichage de mon tableau .....

Sinon oui c'est bien des tableaux associatifs multi-dimensionnels ... encore dsl, et merci en tout cas
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
33
tu n'as pas à être désolé, l'essentiel est que ça baigne, il n'y avait pas de raison.
                  Cordialement    Bul  [mon Site] [M'écrire], <!--