That is some classy code...
    Submitted by phrax on Wed, 2004-12-08 12:48.
    Hall of Fame | Bad Architecture | Fugly Code | Wonky Code
    
  
  Thanks to Andreas D. for sending this one in. This PHP code generates a heirachical menu in a not so nice way.
- WTF #1 is for being very 'fugly' code. Nobody should indent with more than 4 spaces!
 - WTF #2 is the 
menuclass. This class really has no point other than to hold two values which can be done with a simple array. See my example below. - WTF #3 is this 
$menu[$i][$j][0][0][0]->target. There's nothiing like a 5 dimensional array to make a really simple thing like menu generation really difficult. 
Be sure to shield your eyes and don't look directly at this code...
<?php
class menu{
       var $name;
       var $target;
       function menu($name, $target){
               $this->name = $name;
               $this->target = $target;
       }
}
function drawMenu(){
       global $menu, $active_menu;
       $kat=$active_menu["kat"];
       while (list($i) = each($menu)) {
               if ($i == $kat) {
                       //category title
                       //PrintMenuTitle($menu[$i][0][0][0][0]->name);
                       $menu[$i][0][0][0][0]->name;
                       //level-1
                       while (list($j) = each($menu[$kat])) {
                               if ($j > 0) {
                                       PrintMenu(1, $menu[$i][$j][0][0][0]->name, $menu[$i][$j][0][0][0]->target, (($j == $active_menu["sub1"]) ? 1 : 0));
                                       //level-2
                                       if ($j == $active_menu["sub1"]){
                                               while (list($k) = each($menu[$kat][$j])) {
                                                       if ($k > 0) {
                                                               PrintMenu(2, $menu[$i][$j][$k][0][0]->name, $menu[$i][$j][$k][0][0]->target, (($k == $active_menu["sub2"]) ? 1 : 0));
                                                               //level-3
                                                               if ($k == $active_menu["sub2"]){
                                                                       while (list($l) = each($menu[$kat][$j][$k])) {
                                                                               if ($l > 0) PrintMenu(3, $menu[$i][$j][$k][$l][0]->name, $menu[$i][$j][$k][$l][0]->target, (($l == $active_menu["sub3"]) ? 1 : 0));
                                                                       }
                                                               }
                                                       }
                                               }
                                       }
                               }
                       }
                       PrintEnding();
               }
       }
}
function PrintMenu($level, $name, $target, $active) {
       switch ($level) {
           case 1:
                                       $width = 0;
                                       break;
           case 2:
                                       $width = 15;
               break;
           case 3:
                                       $width = 30;
               break;
       /*
       case 3:
               $colspan = array(4,2,1);//421
                                       $size = "small";
                                       $width = 22;
                                       $width2 = 6;
                                       $align = "right";
                                       $arrowwidth = 3;
                                       $arrowheight = 5;
                                       $paddingtop = 6;
                                       $class = "subnav";
               break;
           case 4:
               $colspan = array(4,2,1);
               break;
*/
       }
        $highlight = (($active == 1) ? "on" : "off" );
       echo '<tr>
                                       <td><img src="/_res/images/blank.gif" height="3" width="1"border="0" alt=""></td>
                               </tr>
                       </table>
                       <table border="0" cellspacing="0" cellpadding="0">
                               <tr>
                                       <td><img src="/_res/images/blank.gif" width="1" height="5" border="0" alt=""></td>
                                       <td valign="top" width="'.$width.'"><img src="/_res/images/blank.gif" width="'.$width.'" height="1" border="0" alt=""></td>
                                       <td valign="top"><img src="/_res/images/nav/arrow_'.$highlight.'.gif" width="7" height="7" border="0" vspace="4" alt="Arrow"></td>
                                       <td><img src="/_res/images/blank.gif" width="6" height="1" border="0" alt=""></td>
                                       <td><a href="'.$target.'" class="navlink">'.$name.'</a></td>
                               </tr>';
}
function PrintEnding() {
       echo '</table>';
}
?>
phrax Recommends...
Usually when I do recursive menus I use arrays and do something like this. There are probably much better techniques but this is an example of something fairly simple.
<?php
/**************************************************************
  Some quick example code demonstrating how to
  generate a recursive menu script
 **************************************************************/
function menu($name,$URL = null)
{ /* Helper function to reduce the number of times we have to 
     type array(...). This also cuts down on the # of bugs
   */
    return array('name' => $name,
                 'URL'  => $URL,
                 'children' => array() // blank for now. 
                );
}
function printMenu(&$children)
{
    // HTML here for the sake of example. Normally I would avoid
    // this. :) 
    echo '<ul>';
    foreach ($children as $id => $child)
    {
        if ($child['URL'] != null) {
            printf('<li><a href="%s" id="%s">%s</a></li>',$child['URL'],
                htmlentities($id),htmlentities($child['name']));
        } else {
            printf('<li>%s</li>',htmlentities($child['name']));
        }
        echo "\n"; // so we have some nice HTML :)
        
        // here's the recursion. 
        if (count($child['children']))
            printMenu($child['children']);
    }
    echo "</ul>\n"; 
}
// This is where we define the menu. 
$menu = menu('Root','/'); 
$menu['children']['c1'] = menu('About PHPWTF','/about'); 
$menu['children']['c2'] = menu('Categories'); 
$menu['children']['c2']['children']['c2s1'] = menu('Wonky Code','/taxonomy/term/3'); 
$menu['children']['c2']['children']['c2s2'] = menu('Bad Architecture','/taxonomy/term/1'); 
$menu['children']['c2']['children']['c2s3'] = menu('Hall of Fame','/taxonomy/term/7'); 
// etc.
$menu['children']['c3'] = menu('RSS Feeds'); 
$menu['children']['c3']['children']['c3s1'] = menu('RSS'); 
$menu['children']['c3']['children']['c3s1']['children']['rss1'] = menu('RSS 0.92','/node/feed'); 
$menu['children']['c3']['children']['c3s1']['children']['rss2'] = menu('RSS 1.0','/index.rdf'); 
$menu['children']['c3']['children']['c3s1']['children']['rss3'] = menu('RSS 2.0','/rss2.xml'); 
$menu['children']['c3']['children']['c3s2'] = menu('Atom','/atom.xml'); 
// etc. 
// recursion
printMenu($menu['children']);
?>
The above will generate this:
- About PHPWTF
 - Categories
 - RSS Feeds
 

