public function getParentsWithChildren() { $top = ['children' => []]; $insertIn = function (&$root, $parentAlias, $alias, $value) use(&$insertIn) { foreach ($root['children'] as $i => $child) { if ($i == $parentAlias) { $root['children'][$i]['children'][$alias] = $value; } else { if ($result = $insertIn($root['children'][$i], $parentAlias, $alias, $value)) { return $result; } } } return false; }; foreach ($this->models as $index => $model) { $alias = $model['alias']; $value = ['children' => [], 'self' => $this->getModelByAlias($alias)]; if ($parentAlias = $model['matchInfo']['parent'] ?? null) { if ($insertIn($top, $parentAlias, $alias, $value)) { $this->logger->warning("Unable to find parent ({$parentAlias}) for model: {$alias}"); } } else { $top['children'][$alias] = $value; } } return $top['children']; }