Получение данных из объекта массива массивов

Я знаю, что в этом вопросе больше структур данных, но, поскольку я делаю это в 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 ($ entity) из 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

1

Решение

Если вам нужно получить объекты в виде массивов, а не объектов, вам нужно использовать Учитель гидратор:

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

Заметка:
Я бы предложил оставить объекты как объекты и использовать геттеры:

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;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector