求助:递归统计树形结构中每个父节点的所有子节点数量
问题根源与修复方案
核心问题点
- 数据源缺失:你只查询了
parent_id=0的根节点,但递归查找子节点需要所有节点的数据,当前$data里没有子节点记录,自然返回空数组。 - 字段名不匹配:函数里用
$row['sys_id'],但数据库查询的是id字段,导致无法正确构建树形结构。 - 变量覆盖逻辑错误:循环中每次覆盖
$d,最终仅输出最后一个根节点的结果,且因数据源错误结果为空。
修复后的代码实现
1. 修改children.php:获取全量节点数据并统计
// 先查询所有位置节点,确保递归时有完整数据 $r = mysqli_query($link, "SELECT `id`,`parent_id` FROM locations"); $allNodes = []; while($row = mysqli_fetch_assoc($r)) { $allNodes[] = $row; } // 筛选出所有根节点(parent_id=0) $rootNodes = array_filter($allNodes, function($node) { return $node['parent_id'] === '0'; }); // 遍历每个根节点,统计其所有递归子节点数量 foreach($rootNodes as $root) { // 方案1:先构建树形结构再统计 $tree = buildtree($allNodes, $root['id']); $childCount = countAllChildren($tree); // 方案2:直接递归统计(无需构建树形结构,效率更高) // $childCount = countChildren($allNodes, $root['id']); echo "根节点ID {$root['id']} 的子节点总数:{$childCount}\n"; }
2. 修改/补充function.php的函数
// 修复后的树形结构构建函数(修正字段名) function buildtree($src_arr, $parent_id, $tree = []) { foreach($src_arr as $idx => $row) { if($row['parent_id'] == $parent_id) { // 用数据库查询的`id`字段替代不存在的`sys_id` $tree[$row['id']] = $row; unset($src_arr[$idx]); $tree[$row['id']]['children'] = buildtree($src_arr, $row['id']); } } ksort($tree); return $tree; } // 递归统计树形结构中的所有子节点数量 function countAllChildren($tree) { $count = 0; foreach($tree as $node) { $count += 1; // 统计当前子节点 if(!empty($node['children'])) { $count += countAllChildren($node['children']); // 递归统计子节点的子节点 } } return $count; } // 可选:直接统计子节点数量(无需构建树形结构) function countChildren($allNodes, $parent_id) { $count = 0; foreach($allNodes as $node) { if($node['parent_id'] == $parent_id) { // 当前节点+其所有子节点的数量 $count += 1 + countChildren($allNodes, $node['id']); } } return $count; }
内容的提问来源于stack exchange,提问作者SULTAN
相关产品推荐
相关产品推荐

