来自数组的递归菜单树

时间:2015-07-21 07:30:15

标签: php

我在this site上环顾四周,在互联网的其他地方,我已经尝试了很多东西,但不能理解构建分层的原则数组中的菜单树。

我有一个这样的数组:

$categories = array (
    0 =>
        array(
            'term_id' => '1413',
            'name' => 'Parent',
            'parent' => '0',
        )
    ,
    19 =>
        array(
            'term_id' => '2743',
            'name' => 'Child',
            'parent' => '1413',
        )
    ,
    21 =>
        array(
            'term_id' => '2744',
            'name' => 'Grand child',
            'parent' => '2743',
        )
    ,
    22 =>
        array(
            'term_id' => '2738',
            'name' => 'Grand Child',
            'parent' => '2716',
        )
    ,
    25 =>
        array(
            'term_id' => '2716',
            'name' => 'Child',
            'parent' => '1413',
        )
    ,
    33 =>
        array(
            'term_id' => '2722',
            'name' => 'Child',
            'parent' => '1413',
        )
    ,
    41 =>
        array(
            'term_id' => '2720',
            'name' => 'Grand child',
            'parent' => '2716',
        )
    ,
    58 =>
        array(
            'term_id' => '2717',
            'name' => 'Grand child',
            'parent' => '2716',
        )
    ,
    618 => 
        array(
            'term_id' => '3321',
            'name' => 'Grand child',
            'parent' => '2743',
        )
    );

我现在想要构建一个输出如下的菜单:

Parent
  - Child
    - Grand child
    - Grand child
- Child
    - Grand child
    - Grand child
Parent
  - Child
    - Grand child
    - Grand child
- Child
    - Grand child
    - Grand child

我最接近的是下面的代码,但我不知道我在做什么。

$hasChild = 0;
$idCount = array();
function buildTree($arr, $parent = 0){
    global $hasChild;
    global $idCount;
    foreach($arr as $item){
        if($item['parent'] == 0 && $hasChild == 0 && !in_array($item['term_id'], $idCount)){
            array_push($idCount, $item['term_id']);
            echo $item['name'];
            $hasChild = 1;
            buildTree($arr, $item['parent']);
        }else{
            if(!in_array($item['term_id'], $idCount)){
                echo '<br>- '.$item['name'];
            }
        }
    }
}

buildTree($categories, 0);

虽然我很高兴我终于得到了一个没有错误的实际输出,带有重复的列表对我没有帮助。

我真的希望有人可以把我推向正确的方向,因为我不知道(我正在做什么)...

2 个答案:

答案 0 :(得分:0)

你可以试试这个 - 如果你也想要缩进,你可以在递归函数中添加一些int参数,定义要添加多少空格作为回显行的前缀......:

function buildTree($arr, $parent = 0, $indent = 0)
{
    foreach($arr as $item)
    {
        if ($item["parent"] == $parent)
        {
            if ($indent != 0)
            {
                echo str_repeat("&nbsp;", $indent) . "-&nbsp;";
            }
            echo $item['name'] . '<br/>';
            buildTree($arr, $item['term_id'], $indent + 2);
        }
    }
}

buildTree($categories);

答案 1 :(得分:0)

如何使用标签UL和LI更改此功能以构建输出?我试过这样:

function buildTree($arr, $parent = 0)
{
    $this->menu .= "<ul>";
    foreach($arr as $item)
    {
        if ($item["parent"] == $parent)
        {  
            $this->menu .= "<li>".$item['name']."</li>";
            buildTree($arr, $item['term_id']);
        }
    }
$this->menu .= "</ul>";
return $this->menu;
}

buildTree($类别);

但我有一些空的<ul></ul>每个

  • 标签,例如

    <ul>
        <li>entry 1</li>
        <ul></ul>
        <li>entry 2</li>
        <ul></ul>
    </ul>