dongtangxi1584 2013-02-21 04:10
浏览 24

从多维无限父子树创建菜单

Anyone?

Thanks in advance, and let me know if you need any additional info.

I am attempting to turn a multi dimensional array to a multiple nested html navigation menu. I have the jist of it from another answer on SO: solution here.

What I am trying to figure out is how to preserve the top level parent link (and any subsequent child page links) in the url for the next child array. I tried passing in the link to the function when it calls itself to build the array, but that only preserved the most recent parent link.

Example:

Home About
-Info
--Sub Page

becomes:

home about about/info about/info/subpage

Here is a sample array:

Array
(
[0] => stdClass Object
    (
        [id] => 12
        [parent] => 11
        [name] => Sub Page
        [link] => sub_page
        [target] => _self
    )

[1] => stdClass Object
    (
        [id] => 14
        [parent] => 12
        [name] => Test
        [link] => test_test
        [target] => _self
    )

[2] => stdClass Object
    (
        [id] => 9
        [parent] => 0
        [name] => Home
        [link] => home
        [target] => _self
    )

[3] => stdClass Object
    (
        [id] => 11
        [parent] => 10
        [name] => Info
        [link] => info
        [target] => _self
    )

[4] => stdClass Object
    (
        [id] => 13
        [parent] => 10
        [name] => Test
        [link] => test
        [target] => _self
    )

[5] => stdClass Object
    (
        [id] => 10
        [parent] => 0
        [name] => About
        [link] => about
        [target] => _self
    )

)

And here is the code I am using:

function create_menu_array($arr, $parent = 0){
    $pages = array();
    foreach($arr as $page){
        if($page->parent == $parent){               
            $page->sub = isset($page->sub) ? $page->sub : $this->create_menu_array($arr, $page->id);
            $pages[] = $page;
        }
    }
    return $pages;
}

function create_menu_html($nav){
    $html = '';
    foreach($nav as $page){
        $html .= '<ul><li>';
        $html .= '<a href="' . base_url().$page->link . '" target="'.$page->target.'">' . $page->name . '</a>';
        $html .= $this->create_menu_html($page->sub);
        $html .= '</li></ul>';
    }
    return $html;
}
  • 写回答

1条回答 默认 最新

  • doujie9882 2013-02-21 05:37
    关注

    Solution with recursive function:

    example: http://phpfiddle.org/main/code/pmw-7i3

    <?php
    
    function array_process_for_ids($items) {
        $new_array = array();
        foreach ($items as $item) {
            $new_array[$item['id']] = $item;
        }
        return $new_array;
    }
    
    function menu($items) {
        function menu_recursive($parent_item) {
            global $items;
            unset($items[$parent_item['id']]);
            echo '<div style="padding-left: 15px;">';
            echo '- '.$parent_item['name'];
            foreach ($items as $item) {
                if ($item['parent'] == $parent_item['id']) {
                    menu_recursive($item);
                }
            }
            echo  '</div>';
        }
        foreach ($items as $item) {
            if ($item['parent'] == 0) menu_recursive($item);
        }
    }
    
    $items = array(
        array(
            'id' => 10,
            'parent' => 0,
            'name' => 'Top Page 1',
            'link' => 'top_page_1',
            'target' => '_self'
        ),
        array(
            'id' => 12,
            'parent' => 0,
            'name' => 'Top Page 2',
            'link' => 'top_page_2',
            'target' => '_self'
        ),
        array(
            'id' => 25,
            'parent' => 10,
            'name' => 'Sub Page 1 of top page 1',
            'link' => 'sub_page_1_of_top_page_1',
            'target' => '_self'
        ),
        array(
            'id' => 26,
            'parent' => 12,
            'name' => 'Sub Page 1 of top page 2',
            'link' => 'sub_page_1_of_top_page_2',
            'target' => '_self'
        ),
        array(
            'id' => 28,
            'parent' => 26,
            'name' => 'Sub Page of sub page 1 of top page 2',
            'link' => 'sub_page_of_sub_page_1_of_top_page_2',
            'target' => '_self'
        )
    );
    
    $items = array_process_for_ids($items);
    
    menu($items);
    
    ?>
    
    评论

报告相同问题?

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示