Re: Having trouble with a multidimensional array menu

From: Date: Thu, 19 Feb 2009 06:44:12 +0000
Subject: Re: Having trouble with a multidimensional array menu
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-288590@lists.php.net to get a copy of this message
Daevid Vincent wrote:
I'm trying to build a multi-array menu (but open to using classes or something if that makes this easier). Does anyone have a solution already working? I'm very close, but I can't seem to get my "directories" to work and I end up with extraneous <ul> blocks. here's what I need to re-create:
Try this function instead. function multiArray2MenuTree( $menu, $indent = 0, $sub = false ) { if ( is_array($menu) && count($menu) ) {
    print(str_repeat("\t",$indent).'<ul class="navTree toggleClosed">');
    foreach ($menu as $key => $value) {
      //echo "<b>$key</b> = $value<br/>\n";
      if ( is_array($value) ) {
        print(str_repeat("\t",$indent+1).
'<li id="'.$key.'" class="file ext_txt"><a href="'. $value['page'].'">'.$value['alt'].'</a>');
        multiArray2MenuTree($value, $indent+1, true);
        print(str_repeat("\t",$indent+1).'</li>');
      } elseif ($key == 'alt' && !$sub) {
        print(str_repeat("\t",$indent+1).'<li id="'.$key.
'" class="directory collapsed"><a href="#" class="toggle">'.$value['alt'].'</a></li>');
      } else {
        print(str_repeat("\t",$indent+1).'<li id="'.$key.
'" class="directory collapsed">I did not match either if condition, you need to figure out why...</li>');
      }
    }
    print(str_repeat("\t",$indent).'</ul>');
} } This might point out what is happening. Now, to fix it. Use this... function multiArray2MenuTree( $menu, $indent = 0, $sub = false ) { $output = ''; if ( is_array($menu) && count($menu) ) {
    foreach ($menu as $key => $value) {
      if ( is_array($value) ) {
        $output .= str_repeat("\t",$indent).'<li id="'.$key.
                   '" class="file ext_txt"><a href="'.
                   $value['page'].'">'.$value['alt']."</a>";
        $output .= multiArray2MenuTree($value, $indent+1, true);
        $output .= "</li>\n";
      } elseif ($key == 'alt' && !$sub) {
        $output .= str_repeat("\t",$indent).'<li id="'.$key.
                   '" class="directory collapsed"><a href="#"
                   class="toggle">'.$value['alt']."</a></li>\n";
      }
    }
    if ( strlen($output) > 0 ) {
      $output = PHP_EOL.str_repeat("\t",$indent).
'<ul class="navTree toggleClosed">'.
      		PHP_EOL.$output.PHP_EOL.
str_repeat("\t",$indent).'</ul>';
    }
} return $output; } echo multiArray2MenuTree($navArray); Try the above and let us know how it worked.

« previous php.general (#288590) next »