PHP树形数组遍历:如何找出所有根节点及其子孙节点?

php树形结构遍历:寻找根节点及后续节点

本文将解答一个关于php树形结构遍历的算法问题。题目要求从一个类似树结构的数组中找出所有根节点及其子孙节点。 该树结构并非标准的树结构,而是使用一个数组,其中每个元素包含一个节点值(‘node’)和其子节点数组(‘children’)。

问题描述:给定一个如下所示的php数组,如何找到所有根节点,并遍历出所有根节点及其子孙节点?

$tree = [    ['node' => 2, 'children' => [3, 9, 4]],    ['node' => 7, 'children' => [2]],    ['node' => 3, 'children' => [6]],    ['node' => 4, 'children' => [5]],    ['node' => 5, 'children' => [8]],    ['node' => 10, 'children' => [11]]];

解决方法

算法的核心思想是先找到所有根节点,然后递归遍历其子节点。 具体步骤如下:

立即学习“PHP免费学习笔记(深入)”;

找到第一层节点(根节点): 通过遍历整个数组,判断每个节点的’node’值是否出现在任何其他节点的’children’数组中。 如果一个节点的’node’值不在任何’children’数组中,则该节点为根节点。递归查找: 利用递归函数,遍历每个根节点的子节点。 在递归过程中,将已访问的节点从数组中移除,避免重复访问。 递归函数使用静态变量$result来存储所有已访问的节点。

php代码实现:

 2, 'children' => [3, 9, 4]],    ['node' => 7, 'children' => [2]],    ['node' => 3, 'children' => [6]],    ['node' => 4, 'children' => [5]],    ['node' => 5, 'children' => [8]],    ['node' => 10, 'children' => [11]]];// 先将子元素合并$children = [];foreach ($tree as $k => $v) {    $children = array_merge($children, $v['children']);}// 找出第一层$loop = [];foreach ($tree as $item) {    if (!in_array($item['node'], $children)) {        $loop[] = $item['node'];    }}// 递归找结果function recursion(&$tree, $loop){    static $result = [];    $result = array_merge($result, $loop);    if ($tree) {        $next_children = [];        foreach ($tree as $k => $item) {            if (in_array($item['node'], $loop)) {                $next_children = array_merge($next_children, $item['children']);                unset($tree[$k]);            }        }        return recursion($tree, $next_children);    } else {        return $result;    }}$result = recursion($tree, $loop);print_r($result);// 结果// Array ( [0] => 7 [1] => 10 [2] => 2 [3] => 11 [4] => 3 [5] => 9 [6] => 4 [7] => 6 [8] => 5 [9] => 8 )?>

这段代码实现了题目要求的功能,通过先找到根节点,然后递归遍历所有子节点,最终输出所有节点。 需要注意的是,递归函数中使用了静态变量$result来存储结果,以及unset操作来避免重复访问节点。

以上就是PHP树形数组遍历:如何找出所有根节点及其子孙节点?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1285688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月11日 01:42:33
下一篇 2025年12月11日 01:42:48

相关推荐

发表回复

登录后才能评论
关注微信