在PHP中递归生成嵌套导航

时间:2014-10-13 18:07:38

标签: php html recursion

我有一个看起来像这样的php类:

class $nav_node {
    public $id;
    public $page_name;
    public $parent_id;
    public $page_content;
}

我的目标是构建一个函数,该函数只接受这些nav_nodes中的一个 并将其推入现有的嵌套导航结构中。

$nav_nodes = [];
function add_node($new_node) {

}

我想简单地使用html的

来构建嵌套的导航结构
<ul> and <li> tags ( nested )

这就是结构完成后的样子

Thing
    thing2
       thing3
       thing4
    thing5
    thing6
       thing7
Thing8
    thing9

这是我的第一次尝试,但我并没有真正看到这种情况。

function add_node($new_node) {
        global $nav_nodes; 

        if ( isset($nav_nodes[$new_node->id]) && !is_array($nav_nodes[$new_node->id]) ) {
            $nav_node[$new_node->id] = [];
        }

        $nav_nodes[$new_node->id][] = $new_node;

        // Display "new" nested structure    
}

我想可以在某处使用递归。我在想,即使这个功能 正确构建数组的结构,我仍然需要以某种方式显示它。 也许这是一个单独的功能?也许那个单独的显示功能就是那个 是递归的? 我认为如果这可能是一个单一的功能将是最好的。

无论如何,谢谢你的帮助!!

1 个答案:

答案 0 :(得分:0)

这是我创建的答案,我已经从http://www.jugbit.com/php/php-recursive-menu-with-1-query/改编而来,这是一个非常好的答案。非常简单/简单的代码。

class nav_node {
    public $id;
    public $page_name;
    public $parent_id;
    public $page_content;
    public $items;

    public function __construct($id, $page_name, $parent_id, $page_content)
    {
        $this->id = $id;
        $this->page_name = $page_name;
        $this->parent_id = $parent_id;
        $this->page_content = $page_content;
    }
}

class nav {
    public function generate($nodes)
    {
        ob_start();
        //echo var_dump(nav::create_array($nodes));
        echo '<ul>';

        foreach ($nodes as $node)
        {
            echo '<li>'.$node->page_name.'</li>';
            if (count($node->items) > 0)
            {
                echo nav::generate($node->items);
            }
        }

        echo '</ul>';
        return ob_get_clean();
    }

    public function create_array($nodes, $parent = 0)
    {
        $out = array();
        foreach($nodes as $node){
            if($node->parent_id == $parent){
                $out[$node->id] = $node;
                $out[$node->id]->items = nav::create_array($nodes, $node->id);
            }
        }

        return $out;
    }
}

$nodes[] = new nav_node(
    1,
    'home',
    null,
    'hello world'
);
$nodes[] = new nav_node(
    2,
    'about',
    null,
    'hello world'
);
$nodes[] = new nav_node(
    3,
    'company',
    2,
    'hello world'
);
$nodes[] = new nav_node(
    4,
    'contact',
    3,
    'hello world'
);
$nodes[] = new nav_node(
    6,
    'offices',
    3,
    'hello world'
);
$nodes[] = new nav_node(
    7,
    'staff',
    3,
    'hello world'
);

//var_dump($nodes);

nav::generate(nav::create_array($nodes));

输出:

  
    • 公司
      • 接触
      • 办公室
      • < LI>人员