2015-08-14 128 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