Generowanie menu zagnieżdżonego

0

Witajcie, męczę się z wygenerowaniem menu z danych Json, ale coś średnio mi idzie.

[{"name":"Strona główna","urlid":1,"children":[{"name":"Kontakt","urlid":5,"children":[{"name":"Mapa","urlid":6}]}]}]
  function render_menu($menuArray, $r='')  {
    if (!isset($r)) $r='';

    foreach ($menuArray as $node)
    {
      $r.='<li><a href="#" />'.$node['name'].'</a>';

      if (!empty($node['children']))      {
        $r.='<ul>';
        $r.=render_menu($node['children'], $r);
        $r.='</ul>';
      }

      $r.='</li>';
    }

    return $r;
  }

Niestety wynik, który dostaję to:

<li>
   <a href="#" />Strona główna</a>
   <ul>
<li>
   <a href="#" />Strona główna</a>
   <ul>
<li>
   <a href="#" />Kontakt</a>
   <ul>
<li>
   <a href="#" />Strona główna</a>
   <ul>
      <li>
         <a href="#" />Kontakt</a>
         <ul>
            <li><a href="#" />Mapa</a></li>
         </ul>
      </li>
   </ul>
</li>

Podpowiecie w jaki sposób naprawić funkcję render_menu() tak aby wyszło menu o strukturze?

Strona główna
-- Kontakt
-- -- Mapa
2

nie potrzebujesz przekazywać zmiennej $r

function render_menu($menuArray)  {
    $r='<ul>';
    foreach ($menuArray as $node)
    {
      $r.='<li><a href="#" />'.$node['name'].'</a>';

      if (!empty($node['children']))      {
    	
        $r.=render_menu($node['children']);
        
      }

      $r.='</li>';
    }
      $r.='</ul>';

    return $r;
  }

https://onlinephp.io/c/af129

0

Dziękuję za odpowiedź, rozwiązała ona problem jednak zastanawiam się jeszcze nad jedną rzeczą, moja funkcja obecnie wygląda tak:

function render_menu($menuArray, $urls_db, $active_url, $level=0){
  $level++;

  $r='<ul data-level="'.$level.'">';

  foreach ($menuArray as $node)  {
    $link = ADDRESS.'/'.$urls_db[$node['urlid']];

    if ($link==$active_url) $active=' class="active"';
    else                    $active='';

    $r.='<li'.$active.'><a href="'.$link.'">'.$node['name'].'</a>';

    if (!empty($node['children']))    {
      $r.=render_menu($node['children'], $urls_db, $active_url, $level);
    }

    $r.='</li>';
  }

  $r.='</ul>';

  return $r;
}

To co chcę zrobić, to w menu zagnieżdżonym oznaczyć klasą "active" całą ścieżkę od najmniejszego childa do głównego parenta, a nie jedynie tak jak jest teraz jednego linku określonego w parametrze $active_url. W jaki sposób mogę to zrobić przy modyfikacji ten funkcji, bez bawienia się z DOM-em?

Idealna byłaby funkcja typu "parent" do tablicy utworzonej z Jsona, ale PHP chyba nie ma takiej gotowej funkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1