fonksiyonlarla yapılabilir tablo yapınızı tam anlamadım ama siz yazdığım koddaki mantığı çözersiniz. Sadece biraz ingilizce gerektiriyor. Diyorum ki önce foreach döngüsünden geçir. Sonra her elemanı kontrol et alt elemanı var mı varsa tekrardan aynı fonksiyona sok yoksa yazdır.
function getChild($obj){
foreach($obj->subElement as $subElement){
if($subElement->hasSubElement()){
getChild($subElement);
}else{
echo $subElement;
}
}
}