@nurik_6
Back-end PHP Разработчик.

Как правильно отрисовать дерево в PHP с помощью итераторов?

Здравствуйте, работаю с большим и сложным по структуре деревом. Появилась необходимость отрисовать дерево с помощью рекурсии. Изначально пробовал без итераторов, но код стал нечитабельным. Потом сделал следующим способом:

$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 готовый функционал, но так и не понял как это можно использовать. Подскажите как это можно реализовать правильно ?
  • Вопрос задан
  • 269 просмотров
Пригласить эксперта
Ответы на вопрос 1
@asdz
Сначала пройдись по дереву и сконвертируй его в удобную для вывода в хтмл структуру.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект