二叉树结构数据表格展示异常问题求助
问题分析与解决方案
嘿,我仔细看了你的代码,发现几个核心问题导致表格只显示部分数据,咱们一个个来解决:
1. 变量覆盖导致遍历中断
你在嵌套循环里反复使用了$row这个变量,比如外层foreach($right as $row),内层循环又写foreach($row['child'] as $row)——这会直接覆盖外层的$row引用,导致后续的遍历逻辑完全混乱,很多子节点根本没机会被处理。而且多层嵌套的while+foreach都用同一个变量,循环会提前终止,自然只能显示部分数据。
2. HTML表格结构错误
你的控制器代码里,外层的<tr>标签直到循环最后才闭合,但内层循环直接输出了完整的<tr>...</tr>,这相当于在一个<tr>里嵌套了多个<tr>,完全不符合HTML表格的规范。浏览器会尝试自动修正这种错误,但修正过程中很容易丢失部分行数据。
3. 模型递归方法调用笔误
模型的left_count方法最后调用了$this->right_count($emp),这明显是笔误,应该调用left_count来递归获取子节点,否则左右分支的递归逻辑会串线,导致部分节点无法被正确获取。
修复后的代码
控制器(改用递归渲染,避免变量覆盖)
public function left_team_count2() { $right = $this->register->left_team(); echo '<table border="1"> <tr> <th>序号</th> <th>名称</th> <th>ID</th> </tr> <tbody>'; $i = 1; // 用递归函数统一渲染所有节点 $this->renderTreeNodes($right, $i); echo '</tbody> </table>'; echo '<pre>'; print_r($right); } // 新增递归渲染节点的私有方法 private function renderTreeNodes($nodes, &$i) { foreach($nodes as $node) { // 渲染当前节点 echo '<tr> <td>'.$i.'</td> <td>'.$node['name'].'</td> <td>'.$node['user_id'].'</td> </tr>'; $i++; // 如果有子节点,递归渲染 if(!empty($node['child'])) { $this->renderTreeNodes($node['child'], $i); } } }
模型(修正递归调用与变量名)
function left_team() { $result = $this->db->select('user_id,name,time,activation,status') ->from('login') ->where('side','Left') ->where(array('sponser'=>$this->session->userdata('username'))) ->get()->result(); $employee = array(); foreach($result as $data){ $emp = array(); $emp['user_id']=$data->user_id; $emp['name']=$data->name; $emp['time']=$data->time; $emp['activation']=$data->activation; $emp['status']=$data->status; $emp[] = $data->user_id; $emp['child'] = $this->left_count($emp); array_push($employee,$emp); } return $employee; } function left_count($emp) { $this->db->where_in('sponser',$emp); $q = $this->db->get('login'); $tree = $q->result(); $employee = array(); foreach($tree as $data){ // 换个变量名,避免覆盖传入的$emp参数 $empData = array(); $empData['user_id']=$data->user_id; $empData['name']=$data->name; $empData['time']=$data->time; $empData['activation']=$data->activation; $empData['status']=$data->status; $empData[] = $data->user_id; // 修正递归调用,改为left_count $empData['child'] = $this->left_count($empData); array_push($employee,$empData); } return $employee; }
修复说明
- 递归渲染:用专门的递归函数处理节点渲染,每个层级使用独立的
$node变量,彻底避免了变量覆盖问题,所有节点都会被遍历到。 - 规范表格结构:每个节点对应一个独立的
<tr>标签,符合HTML规范,浏览器能正确渲染所有行数据。 - 修正递归逻辑:模型里的递归调用和变量名修正后,子节点能被正确递归获取,不会出现分支串线的问题。
内容的提问来源于stack exchange,提问作者Yash Jaiswal
相关产品推荐
相关产品推荐

