1

we have this array from mysqli query output :

$items = Array
(
    Array
    (
        'id' => 1,
        'title' => 'menu1',
        'parent_id' => 0
    ),
    Array
    (
        'id' => 2,
        'title' => 'submenu1-1',
        'parent_id' => 1
    ),
    Array
    (
        'id' => 3,
        'title' => 'submenu1-2',
        'parent_id' => 1
    ),
    Array
    (
        'id' => 4,
        'title' => 'menu2',
        'parent_id' => 0
    ),
    Array
    (
        'id' => 5,
        'title' => 'submenu2-1',
        'parent_id' => 4
    )
);

and we need this html output with php :

<ul>
        <li><a>menu1</a>
             <ul>
                 <li><a>submenu1-1</a></li>
                 <li><a>submenu1-2</a></li>
             </ul>
        </li>
        <li><a>menu2</a>
             <ul>
                 <li><a>submenu2-1</a></li>
             </ul>
        </li>
</ul>

can anyone help me ? Probably this is very easy but I have tried everything already without success !!

4 Answers 4

4

finally i found answer like this:

function generateTreeMenu($datas, $parent = 0, $limit=0){
            if($limit > 1000) return ''; 
            $tree = '';
            $tree = '<ul>';
            for($i=0, $ni=count($datas); $i < $ni; $i++){
                if($datas[$i]['parent_id'] == $parent){
                    $tree .= '<li><a>';
                    $tree .= $datas[$i]['title'].'</a>';
                    $tree .= generatePageTree($datas, $datas[$i]['id'], $limit++);
                    $tree .= '</li>';
                }
            }
            $tree .= '</ul>';
            return $tree;
}

echo generateTreeMenu($items);
Sign up to request clarification or add additional context in comments.

Comments

3
//index elements by id
foreach ($items as $item) {
    $item['subs'] = array();
    $indexedItems[$item['id']] = (object) $item;
}


//assign to parent
$topLevel = array();
foreach ($indexedItems as $item) {
    if ($item->parent_id == 0) {
        $topLevel[] = $item;
    } else {
        $indexedItems[$item->parent_id]->subs[] = $item;
    }
}

//recursive function
function renderMenu($items) {
    $render = '<ul>';

    foreach ($items as $item) {
        $render .= '<li>' . $item->title;
        if (!empty($item->subs)) {
            $render .= renderMenu($item->subs);
        }
        $render .= '</li>';
    }

    return $render . '</ul>';
}

echo renderMenu($topLevel);

1 Comment

can you help me about this stackoverflow.com/questions/26548071/…
2

The problem here is just the structure of the array, so first you can convert the array to a more suitable structure, then you can draw your list easily.

Here is a function to convert the array:

function makeTree( $rst, $level, &$tree )
{
    for ( $i=0, $n=count($rst); $i < $n; $i++ )
    {
      if ( $rst[$i]['parent_id'] == $level )
      {
        $branch = array(
          'id' => $rst[$i]['id'],
          'title' => $rst[$i]['title'],
          'children' => array()
        );
        makeTree( $rst, $rst[$i]['id'], $branch['children'] );
        $tree[] = $branch;
      }
    }
}

Mode of use:

$tree = array();
makeTree( $originalArray, 0, $tree );

At the end, you will have a new array in $tree structured as shown below, which you can easily draw in your view.

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => menu1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [title] => submenu1-1
                            [children] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [id] => 3
                            [title] => submenu1-2
                            [children] => Array
                                (
                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 4
            [title] => menu2
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [title] => submenu2-1
                            [children] => Array
                                (
                                )

                        )

                )

        )

)

Comments

0

Try this

$node = array();
foreach ($items as $item) {
    if ($item['parent_id'] == 0) {
        $node[$item['id']][$item['id']] = $item['title'];
    } else {
        $node[$item['parent_id']][$item['id']] = $item['title'];
    }
}
$result = array();
foreach ($node as $key => $value) {
    $result[$value[$key]] = array_diff($value, array($key => $value[$key]));
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.