You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现:以KEY=2为根构建二叉树并过滤关联数据

解决方案(CodeIgniter 构建关联二叉树并生成树形结构)

1. 数据层:实现递归树形结构构建(Model)

保留你已有的get_rev()获取全量数据,新增方法完成过滤与树形构建逻辑:

// 获取mp_members全量数据
public function get_rev()
{
    return $this->db->get('mp_members')->result_array();
}

// 构建以指定KEY为根的二叉树(默认根KEY=2)
public function build_tree($root_key = 2)
{
    $all_data = $this->get_rev();
    // 将数据转为KEY为索引的关联数组,提升查找效率
    $data_map = [];
    foreach ($all_data as $item) {
        $data_map[$item['key']] = $item;
        $data_map[$item['key']]['children'] = []; // 初始化子节点容器
    }

    // 递归收集所有与根节点关联的KEY,过滤无关数据
    $related_keys = $this->_collect_related_keys($root_key, $data_map);
    $filtered_data = array_filter($data_map, function($item) use ($related_keys) {
        return in_array($item['key'], $related_keys);
    });

    // 组装树形结构:将子节点挂载到对应父节点下
    foreach ($filtered_data as $item) {
        if (isset($filtered_data[$item['rev']]) && $item['rev'] !== $root_key) {
            $filtered_data[$item['rev']]['children'][] = $item;
        }
    }

    // 返回根节点的完整树形数据
    return $filtered_data[$root_key];
}

// 私有方法:递归收集所有关联KEY
private function _collect_related_keys($current_key, $data_map)
{
    $keys = [$current_key];
    // 查找所有REV等于当前KEY的子节点,递归收集其关联KEY
    foreach ($data_map as $item) {
        if ($item['rev'] === $current_key) {
            $keys = array_merge($keys, $this->_collect_related_keys($item['key'], $data_map));
        }
    }
    return $keys;
}

2. 控制器层:传递树形数据到视图(Controller)

public function tree_display()
{
    $this->load->model('Your_Model_Name'); // 替换为你的Model类名
    $tree_data = $this->Your_Model_Name->build_tree();
    $this->load->view('tree_view', ['tree' => $tree_data]);
}

3. 视图层:渲染树形图表(View)

主视图 tree_view.php

<style>
.tree-container {
    margin: 20px;
}
.tree-node {
    margin: 8px 0;
    padding-left: 24px;
    border-left: 2px solid #666;
    position: relative;
}
.tree-node::before {
    content: "";
    position: absolute;
    left: -2px;
    top: 0;
    width: 12px;
    height: 12px;
    border-top: 2px solid #666;
    border-left: 2px solid #666;
}
.tree-root {
    border-left: none;
    padding-left: 0;
}
.tree-root::before {
    display: none;
}
.node-label {
    padding: 4px 8px;
    background: #f5f5f5;
    border-radius: 4px;
    display: inline-block;
}
</style>

<div class="tree-container">
    <?php echo $this->load->view('tree_node', ['node' => $tree, 'is_root' => true], true); ?>
</div>

递归子视图 tree_node.php

<div class="tree-node <?php echo isset($is_root) ? 'tree-root' : ''; ?>">
    <div class="node-label"><?php echo $node['name']; ?> (KEY: <?php echo $node['key']; ?>)</div>
    <?php if (!empty($node['children'])): ?>
        <?php foreach ($node['children'] as $child): ?>
            <?php echo $this->load->view('tree_node', ['node' => $child], true); ?>
        <?php endforeach; ?>
    <?php endif; ?>
</div>

逻辑说明

  • 数据过滤:通过_collect_related_keys递归遍历所有与根节点(KEY=2)关联的节点,精准过滤无关数据;
  • 树形构建:利用关联数组快速匹配父节点,将子节点挂载到对应父节点的children字段中;
  • 视图渲染:通过递归加载子视图的方式,自动渲染多层级树形结构,CSS样式模拟树形连线效果。

内容的提问来源于stack exchange,提问作者proyeksi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:23:16