Как использовать RecursiveIteratorIterator для создания многоуровневого HTML-меню?
У меня проблемы с тем, чтобы обрести голову RecrusiveIteratorIterator
и родственники, чтобы перебрать многомерный массив страниц, чтобы построить многоуровневое меню в PHP.
Обычно я просто создаю функцию, которая зацикливается на уровне и вызывает себя для зацикливания любых дочерних элементов. Но я хочу использовать итераторские интерфейсы в PHP, чтобы сделать мой код лучше.
Мой массив выглядит так:
$pages = array(
new Page(1, 'Home'),
new Page(2, 'Pages', array(
new Page(3, 'About'),
new Page(4, 'Contact')
)),
new Page(5, 'Categories', array(
new Page(6, 'Clothing'),
new Page(7, 'DVDs')
))
);
Аргументы в моем Page
Конструктор - это просто идентификатор страницы и имя страницы.
Как я могу использовать итераторы PHP для создания меню, которое выглядит следующим образом?
<ul>
<li>Home</li>
<li>Pages
<ul>
<li>About</li>
<li>Contact</li>
</ul>
</li>
<li>Categories
<ul>
<li>Clothing</li>
<li>DVDs</li>
</ul>
</li>
</ul>
1 ответ
Решение
Обычно это трехэтапная процедура:
- Вы реализуете бетон
RecursiveIterator
который предлагает итерацию рекурсии для вашей древовидной структуры. Это выглядит такRecursiveArrayIterator
соответствует вашим потребностям здесь. - Вы перебираете это с
RecursiveIteratorIterator
который может превратить отторжение в ваш вывод (сравните сRecursiveTreeIterator
). - Вы делаете вывод, повторяя с
foreach
над вашим более конкретнымRecursiveIteratorIterator
,
Пример кода:
// consume implementation of step 1
$it = new PagesRecursiveIterator($pages);
// consume implementation of step 2
$list = new RecursiveUlLiIterator($it);
// perform iteration given in step 3
foreach($list as $page) {
echo $page->getName();
}