Здравствуйте, работаю с большим и сложным по структуре деревом. Появилась необходимость отрисовать дерево с помощью рекурсии. Изначально пробовал без итераторов, но код стал нечитабельным. Потом сделал следующим способом:
$iter = new RecursiveArrayIterator($contract);//Передали многомерный массив
//Описал callback функцию, для iterator_apply
$navigateArray = function ($iterator) use (&$navigateArray,$dict) {
//Где &$navigateArray - будем использовать для рекурсии, а dict некий словарь
while ($iterator->valid()) {
if ($iterator->hasChildren()) {
$key = strtoupper($iterator->key());
$original = $key;
$key = (isset($dict[$key]))?$dict[$key]:$key;
?>
<li>
<div class='panel panel-primary' id=key>
<div class='panel-heading'>
<h4 class='panel-title'>
<?=$key?> : <?=$original?>
<a href='<?=$this->getLink($original)?>' class=' my text-right'>
<span class='glyphicon glyphicon-pencil'></span>
<span>Добавить</span>
</a>
</h4>
</div>
<div class='panel-body'>
<ul><?php $navigateArray($iterator->getChildren());?></ul>
</div>
</div>
</li>
<?php
} else {
$key = strtoupper($iterator->key());
$key = (isset($dict[$key]))?$dict[$key]:$key;
?>
<ul>
<b><?=$key?></b>
<?=$iterator->current()?>
</ul>
<?php
}
$iterator->next();
}
};
iterator_apply($iter,$navigateArray,array($iter));
Проблема в том, что я не могу определить глубину ветки итератора, и как следствие не могу сделать специальную разметку для последнего элемента-массива. Также я наблюдал в некоторых итераторах в SPL готовый функционал, но так и не понял как это можно использовать. Подскажите как это можно реализовать правильно ?