2013-06-26 2 views
0

Salut je reçois un tableau plat d'un service comme suitConstruct tableau multidimensionnel de tableau associatif

[0] [] (@bf4f219) 
    [0] Object (@a55f1a9) 
     breadcrumb "{2}" 
     entity_name "parent 2" 
     id 2 
     level 1 
     parent_id 0 

    [1] Object (@a5be281) 
     breadcrumb "{2,4}" 
     entity_name "child for parent 2"  
     id 4 
     level 2 
     parent_id 2 

    [2] Object (@a5bea01) 
     breadcrumb "{2,4,5}" 
     entity_name "child for 4" 
     id 5 
     level 3 
     parent_id 4 

    [3] Object (@a5ed179) 
     breadcrumb "{2,4,5,7}" 
     entity_name "child for 5" 
     id 7 
     level 4 
     parent_id 5 

    [4] Object (@a5ed6d1) 
     breadcrumb "{2,6}" 
     entity_name "child 2 for parent 2" 
     id 6 
     level 2 
     parent_id 2 

    [5] Object (@a5edb09) 
     breadcrumb "{2,8}" 
     entity_name "another child for 2" 
     id 8 
     level 2 
     parent_id 2 

    [6] Object (@a5edda9) 
     breadcrumb "{2,9}" 
     entity_name "another child for 2" 
     id 9 
     level 2 
     parent_id 2 

ce que je dois faire est de construire un tableau multidimensionnel basé sur l'identifiant et PARENT_ID fourni dans chaque objet, s'il vous plaît noter que le niveau dans la dimension est également fourni pour chaque élément si cela aide. Im ayant un vrai cerveau vide et ne peut pas comprendre celui-ci, s'il vous plaît aider comme je dois trouver une solution rapide.

Merci d'avance.

+0

ce n'est pas un tableau multidimensionnel, mais un arbre. – fmodos

+0

ok c'est un arbre merci pour cela mais comment puis-je construire l'arbre correctement s'il vous plaît? – cghrmauritius

Répondre

0

Puisque vous pouvez avoir n'importe quel nombre de parents_id au niveau de la racine, vous pouvez vous retrouver avec plusieurs arbres.

Essayez ceci, bonne chance:

var trees:Array = buildTrees(FLAT); 

    private static const FLAT:Array = 
    [ 
     {breadcrumb: "{2}", entity_name: "parent 2", 
      id:   2, 
      level:  1, 
      parent_id: 0}, 

     {breadcrumb: "{2,4}", entity_name: "child for parent 2",  
      id:   4, 
      level:  2, 
      parent_id: 2}, 

     {breadcrumb: "{2,4,5}", entity_name: "child for 4", 
      id:   5, 
      level:  3, 
      parent_id: 4}, 

     {breadcrumb: "{2,4,5,7}", entity_name: "child for 5", 
      id:   7, 
      level:  4, 
      parent_id: 5}, 

     {breadcrumb: "{2,6}", entity_name: "child 2 for parent 2", 
      id:   6, 
      level:  2, 
      parent_id: 2}, 

     {breadcrumb: "{2,8}", entity_name: "another child for 2", 
      id:   8, 
      level:  2, 
      parent_id: 2}, 

     {breadcrumb: "{2,9}", entity_name: "another child for 2", 
      id:   9, 
      level:  2, 
      parent_id: 2} 
    ]; 

    private function buildTrees(flat:Array):Array 
    { 
     if (!flat.length) 
      return null; 

     flat.sortOn("parent_id", Array.NUMERIC); 

     var trees:Array = new Array(); 

     var i:uint; 

     for (i = 0; i < flat.length; i ++) 
     { 
      var node:Object = {parent_id: flat[i].parent_id, id: flat[i].id, level: flat[i].level, 
       breadcrumb: flat[i].breadcrumb, entity_name: flat[i].entity_name, nodes: new Array()}; 

      var root:Object = findRoot(flat[i].parent_id, trees); 

      if (root) { 
       root.nodes.push(node); 
      } 
      else 
       trees.push(node); 
     } 

     for (i = 0; i < trees.length; i ++) 
      sortTree(trees[i]); 

     return trees; 
    } 

    private function findRoot(parent_id:int, trees:Array):Object 
    { 
     for (var i:uint = 0; i < trees.length; i ++) 
     { 
      var node:Object = findNode(parent_id, trees[i]); 

      if (node) 
       return node; 
     } 

     return null; 
    } 

    private function findNode(parent_id:int, root:Object):Object 
    { 
     if (root.id == parent_id) 
      return root; 

     for (var i:uint = 0; i < root.nodes.length; i ++) 
     { 
      var node:Object = findNode(parent_id, root.nodes[i]); 

      if (node) 
       return node; 
     } 

     return null; 
    } 

    private function sortTree(root:Object):void 
    { 
     root.nodes.sortOn("level", Array.NUMERIC); 

     for (var i:uint = 0; i < root.nodes.length; i ++) 
      sortTree(root.nodes[i]); 
    } 
Questions connexes