【问题标题】:How can I display an array in a tree view structure?如何在树视图结构中显示数组?
【发布时间】:2019-07-07 10:35:42
【问题描述】:

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

--------------------------------------------
 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 Development 和 Network 是 IT 部门的子项。前端和后端是 Web 开发的子级。

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

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

.....等等......

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

我尝试使用非常简单的方式打印数组

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));

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

【问题讨论】:

  • 您的问题是什么?怎么打印?
  • 是的,我的意思是如何使用 html 在树视图结构中打印数组

标签: php html arrays codeigniter treeview


【解决方案1】:

您需要一个递归函数来检查对象的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>

【讨论】:

    【解决方案2】:
    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>
    

    【讨论】:

    • 我知道如何构建我的数组,但我不知道如何使用 html 中的无序列表以树视图的形式显示我的数组。所以我不能用这个来回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2017-04-18
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多