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
相关产品推荐
相关产品推荐

