Как использовать 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 ответ

Решение

Обычно это трехэтапная процедура:

  1. Вы реализуете бетон RecursiveIterator который предлагает итерацию рекурсии для вашей древовидной структуры. Это выглядит так RecursiveArrayIterator соответствует вашим потребностям здесь.
  2. Вы перебираете это с RecursiveIteratorIterator который может превратить отторжение в ваш вывод (сравните с RecursiveTreeIterator).
  3. Вы делаете вывод, повторяя с 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();
   }
Другие вопросы по тегам