Kevin
Kevin

Reputation: 2688

Hierarchal Menu in PHP from Array

Alright, it's hump day, and my brain's already shot.

Can someone tell me what I'm doing wrong here, I'm trying to build a Navigation list properly (hierarchal)

Here's the array:

Array
(
[0] => Array
    (
        [contentID] => 1
        [parentID] => 0
        [LinkAlias] => 
    )

[1] => Array
    (
        [contentID] => 2
        [parentID] => 0
        [LinkAlias] => inner
    )

[2] => Array
    (
        [contentID] => 3
        [parentID] => 2
        [LinkAlias] => inner-2
    )

[3] => Array
    (
        [contentID] => 4
        [parentID] => 3
        [LinkAlias] => inner-21
    )

)

And my attempts at the recursive function:

    // Parse out the array for displaying a multi-level menu
    private function ParseMenu($menu, $parent = 0){
        $ret .= '<ul>';
        $iCt = count($menu);


        for($i=0; $i < $iCt; ++$i){
            if($menu[$i]['parentID'] == $parent){               
                $ret .= '   <li>' . $menu[$i]['LinkAlias'];
                if($parent > 0){
                    $ret .= ParseMenu($menu, $menu[$i]['contentID']);
                }
                $ret .= '</li>';                
            }
        }
        $ret .= '</ul>';
        return $ret;
    }

Right now, all it is returning:

<ul>
    <li></li>
    <li>inner</li>
</ul>

It should be showing

<ul>
    <li></li><!-- yes this is intentional -->
    <li>inner
            <ul>
                    <li>inner-2
                            <ul>
                                    <li>inner-21</li>
                            </ul>
                    </li>
            </ul>
</ul>

So.. what am I doing wrong, and how can I fix it?

Upvotes: 1

Views: 47

Answers (1)

Chris Morrissey
Chris Morrissey

Reputation: 489

Make this line ...

if($parent > 0){
    $ret .= ParseMenu($menu, $menu[$i]['contentID']);
}

into ...

$ret .= $this->ParseMenu($menu, $menu[$i]['contentID']);

You are never calling your function again because you are always starting with $parent = 0

$ret .= '</ul>';
if($ret == '<ul></ul>'){ 
    return;
} else {
    return $ret;
}

Upvotes: 3

Related Questions