2015-08-14 132 views
1

我知道这个问题是更多的数据结构,但由于我在Symfony中做这件事,可能会有一个更简单的方法。我有一个递归函数treeBuilder()我想调用一些数据来创建一个层次结构。说一个人的数据库,如果他们和父母住在一起,我想创建一个树形结构。我知道我将一个对象数组传递给函数,但它需要是一个数组。我很确定我需要重写这个函数,以便它处理对象的数组,但难倒了。我不知道如何访问数组的元素来检查文件。我知道下面的代码是不正确的,但那是我现在的位置。从数组数组中的对象检索数据

控制器:

public function indexAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $entities = $em->getRepository('CompanyMyBundle:Org')->findAll(); 
     var_dump($entities); 
     $tree=$this->treeBuilder($entities); 
     return array(
      'entities' => $tree, 
     ); 
    } 


private function treeBuilder($ar, $pid=null) 
    { 
     $op=array(); 
     foreach($ar as $item) { 
// I know I have an array of objects 
      if($item['ParentId'] == $pid) { 
       $op[$item['Id']] = array(
        'Street' => $item['Street'], 
        'ParentId' => $item['ParentId'] 
       ); 
       $children = self::treeBuilder($ar, $item['Id']); 
       if($children) { 
        $op[$item['Id']]['children'] = $children; 
       } 
      } 
     } 
     return $op; 

    } 

的var_dump从的indexAction($实体)():

/export/www/working/symfony/src/Company/MyBundle/Controller/DepController.php:34: 
array (size=60) 
    0 => 
    object(Company\MyBundle\Entity\Org)[1556] 
     private 'Name' => string 'Me' (length=46) 
     private 'Street' => string '123 Sesame' (length=255) 
     private 'City' => string 'Myhometown' (length=255) 
     private 'ParentId' => int 0 
     private 'Id' => int 1 
    1 => 
    object(Company\MyBundle\Entity\Org)[1557] 
     private 'Name' => string 'Me2' (length=46) 
     private 'Street' => string '123 Sesame' (length=255) 
     private 'City' => string 'Myhometown' (length=255) 
     private 'ParentId' => int 1 
     private 'Id' => int 2 

回答

2

如果你需要得到实体数组,而不是对象,你就需要使用Doctrine's hydrator

$em = $this->getDoctrine()->getManager(); 
$orgRepo = $em->getRepository('CompanyMyBundle:Org'); 
$entities = $orgRepo->createQueryBuilder('org') 
    ->getQuery() 
    ->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY); 

注意: 我建议将实体留作对象并使用getter:

public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $entities = $em->getRepository('CompanyMyBundle:Org')->findAll(); 
    $tree = $this->treeBuilder($entities); 

    return array(
     'entities' => $tree, 
    ); 
} 


private function treeBuilder($entities, $pid = null) 
{ 
    $op = array(); 
    /** Org $entity */ //Type hinting, if you use autocompletion 
    foreach ($entities as $entity) { 
     if ($entity->getParentId() == $pid) { 
      $op[$entity->getId()] = [ 
       'Street' => $entity->getStreet(), 
       'ParentId' => $entity->getParentId() 
      ]; 
      $children = self::treeBuilder($entities, $entity->getId()); 
      if (!empty($children)) { 
       $op[$entity->geId()]['children'] = $children; 
      } 
     } 
    } 

    return $op; 
} 
+0

是的,您的建议是我正在寻找的。我感到非常愚蠢,我太专注于使用变量而不是setter/getters,而我的phpstorm由于某种原因没有意识到这些方法,但他们工作得很好。 – shayster01