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

二叉树结构数据表格展示异常问题求助

问题分析与解决方案

嘿,我仔细看了你的代码,发现几个核心问题导致表格只显示部分数据,咱们一个个来解决:

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

修复说明

  1. 递归渲染:用专门的递归函数处理节点渲染,每个层级使用独立的$node变量,彻底避免了变量覆盖问题,所有节点都会被遍历到。
  2. 规范表格结构:每个节点对应一个独立的<tr>标签,符合HTML规范,浏览器能正确渲染所有行数据。
  3. 修正递归逻辑:模型里的递归调用和变量名修正后,子节点能被正确递归获取,不会出现分支串线的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:45:39