2013-10-04 1 views
0

Dans mon document Mongo DB, j'avais un tableau imbriqué que j'avais converti en un document imbriqué. Ainsi, par exemple, maintenant mon document ressemble à ceci:Comment construire un tableau imbriqué à partir d'un document Mongo DB plat

{ 
    projects : { 
     "id1" : { 
      name : "project 1" 
      parentProject : null 
     }, 
     "id2" : { 
      name : "project 2" 
      parentProject : null 
     }, 
     "id3" : { 
      name : "sub project 1" 
      parentProject : "id1" 
     }. 
    } 
} 

Quand je reçois cet objet en PHP, j'ai un tableau de taille 3, chaque calée par l'ID du projet:

array(
    'id1' => array('name' => 'project 1', 'parentProject' => null), 
    'id2' => array('name' => 'project 2', 'parentProject' => null), 
    'id3' => array('name' => 'project 3', 'parentProject' => 'id1') 
) 

I besoin de convertir cela en un tableau hiérarchique, mais j'ai des problèmes avec la logique. Quelqu'un pourrait-il aider à me convertir à quelque chose sous la forme:

array(
    array('ID' => 'id1', 'name' => 'project 1', 'subProjects' => 
     array('ID' => 'id3', 'name' => 'project 3', 'subProjects' => null)), 
    array('ID' => 'id2', 'name' => 'project 2', 'subProjects' => null) 
) 

Répondre

0

j'ai pu trouver la solution suivante:

public function createProjectHierarchy($projects, $parentId = null) 
{ 
    $tree = array(); 

    foreach($projects as $projectKey => $project) 
    { 
     if($parentId == $project['parentProjectId']) 
     { 
      $project['subProjects'] = self::createProjectHierarchy($projects, $projectKey); 
      $project['ID'] = $projectKey; 
      unset($project['parentProjectId']); 
      unset($projects[$projectKey]); 

      array_push($tree, $project); 
     } 
    } 

    return $tree; 
} 

Cette fonction renvoie la hiérarchie complètement rempli la façon dont je besoin. J'espère que MongoDB supportera bientôt plusieurs opérateurs positionnels afin que je puisse conserver mes données sous forme de tableaux (et de tableaux imbriqués) dans la base de données.

-1

Une option serait de le stocker sous la forme dont vous avez besoin dans votre code. Par conséquent, l'objet "id3" pourrait juste être un élément à l'intérieur du projet "id1". Quelque chose comme ce qui suit:

"id1": { 
    name:"project1", 
    subProjects:{ 
    "id3": { name:"project3" } 
    } 
} 

Une autre option serait de stocker chaque projet son propre document et utiliser l'une des données « Modèle » Structures d'arbres modèles dans les MongoDB docs: http://docs.mongodb.org/manual/data-modeling/

Questions connexes