如何在树状视图结构中显示数组?

时间:2019-07-07 10:35:42

标签: php html arrays codeigniter treeview

我想构建一个由部门(父级)和子部门(子级)组成的树形视图。在我的数据库中,我认为我有一个很好的结构,如下所示:

--------------------------------------------
 Dep_name         | dep_id | dep_parent_id    
--------------------------------------------
 Accounting       |    1   |        0
 Human-Resources  |    2   |        0
 IT               |    3   |        0
 Network          |    4   |        3
 Web Development  |    5   |        3
 Front-End        |    6   |        5
 Back-End         |    7   |        5

具有dep_parent_id 0的部门--->没有父部门。例如,Web开发和网络是IT部门的子级。前端和后端是Web开发的子代。

我发现了一个递归函数,该函数适合从该数据库表中获取所有数据并将它们放置在正确结构的数组中。但是问题是我不知道如何像树视图一样显示此数组。 例如这样

  • 部门
    • 会计
    • 人力资源
    • IT
    • 网络
    • 网站开发
      • 前端
      • 后端

.....等等....

在我的数据库中,我认为我有一个很好的结构,如下所示:

enter image description here

我尝试使用

以非常简单的方式打印数组
print_r($tree);

它像这样打印它:

Array (
    [0] => stdClass Object (
        [Dep_name] => Accounting and Finance
        [dep_id] => 1
        [dep_parent_id] => 0
    )
    [1] => stdClass Object (
        [Dep_name] => Human-Recources
        [dep_id] => 2
        [dep_parent_id] => 0
    )
    [2] => stdClass Object (
        [Dep_name] => IT
        [dep_id] => 3
        [dep_parent_id] => 0
        [children] => Array (
            [0] => stdClass Object (
                [Dep_name] => Network
                [dep_id] => 5
                [dep_parent_id] => 3
            )
            [1] => stdClass Object (
                [Dep_name] => Web Development
                [dep_id] => 6
                [dep_parent_id] => 3
                [children] => Array (
                    [0] => stdClass Object (
                        [Dep_name] => Front-End
                        [dep_id] => 7
                        [dep_parent_id] => 6
                    )
                    [1] => stdClass Object (
                        [Dep_name] => Back-End
                        [dep_id] => 8
                        [dep_parent_id] => 6
                    )
                )
            )
        )
    )
    [3] => stdClass Object (
        [Dep_name] => Marketing
        [dep_id] => 4
        [dep_parent_id] => 0
        [children] => Array (
            [0] => stdClass Object (
                [Dep_name] => web-marketing
                [dep_id] => 9
                [dep_parent_id] => 4
            )
        )
    )
)

这是我的函数,该函数从数组$ data中获取数据库表中的数据,并构建一个树形数组$ branch。

function buildTree(array $data, $parentId = 0) 
{
    $branch = array();

    foreach ($data as $element) 
    {
        if ($element->dep_parent_id == $parentId) 
        {
            $children = buildTree($data, $element->dep_id);
            if ($children) 
            {
                $element->children = $children;
            }
            $branch[] = $element;
        }

    }

    return $branch;
}

然后我使用:

进行打印
print_r(buildTree($data));

如果您能帮助我解决该问题,并从函数buildTree($data)返回的数组$ branch中以html显示树视图结构,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

function sort(array $array): array
{
    $sort = [];

    foreach($array as $item) {
        if ($item->dep_parent_id !== 0) {
            $sort[$item->dep_parent_id][$item->dep_id] = $item->Dep_name;
            continue;
        }

        $sort[$item->dep_id][0] = $item->Dep_name;
    }

    return $sort;
}

<ul>
    <?php foreach (sort($array) as $item): ?>
        <li><?= $item[0]?></li>
        <?php if (count($item) > 1): ?>
            <ul>
                <?php unset($item[0]); ?>
                <?php foreach($item as $value): ?>
                    <li><?= $value ?></li>
                <?php endforeach ?>
            </ul>
        <?php endif ?>
    <?php endforeach ?>
</ul>

答案 1 :(得分:0)

您需要一个递归函数来检查对象的children属性是否存在-如果存在,请在循环这些元素之前打印出新的<ul>标签。

function printTree($array) {
    $output = "<ul>\n";
    foreach ($array as $a) {
        $output .= "<li>".$a->Dep_name."</li>\n";

        if (isset($a->children)) {
            $output .= printTree($a->children);
        }
    }
    $output .= "</ul>\n";
    return $output;
}

这将返回单个字符串,该字符串具有所描述的层次结构中的HTML。输出将是这样的(嗯,不会像这样缩进,但是HTML会打印出相同的文字)

<ul>
    <li>Accounting and Finance</li>
    <li>Human-Recources</li>
    <li>IT</li>
    <ul>
        <li>Network</li>
        <li>Web Development</li>
            <ul>
                <li>Front-End</li>
                <li>Back-End</li>
            </ul>
    </ul>
    <li>Marketing</li>
    <ul>
        <li>web-marketing</li>
    </ul>
</ul>