欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

版主大大的不用递归《读取树状数据的方法》有bug,修改版

程序员文章站 2024-02-05 22:30:52
...
递归 树状 无限分类 由于版主的帖子有点久远,在后面回复的话,担心有些同学会看不到,所以单独开这个帖子。

版主大大发表于 2013-02-04 11:46:06 的《读取树状数据的方法》的帖子有bug。
bug描述:当 子数据在 父数据之前出现时,构造失败。

经过修改测试,应该可以正常工作了,欢迎大家使用各种数据进行测试,有问题大家一起探讨。
/** * 将“邻接列表算法”组织的数据转换成树状数组 * @param array 二维数据数组 * @return array 多维树状数组 */function tree($arr){    $res = array(); //结果数组    $ind = array(); //索引数组    foreach($arr as $k=>$v) {        list($id, $pid) = array_values($v);        if(isset($ind[$id])){            $ind[$id] = array_merge($v, $ind[$id]);        }else{            $ind[$id] = $v;        }        $ind[$pid]['child'][$id] = &$ind[$id]; //构造索引        if($pid == 0) $res[$id] = &$ind[$id]; //转存根节点组    }    return $res;}// 测试用数组$arr = array(    array('id'=>9, 'pid'=>12,),    array('id'=>10, 'pid'=>13,),    array('id'=>11, 'pid'=>13,),    array('id'=>12, 'pid'=>14,),    array('id'=>14, 'pid'=>0,),    array('id'=>15, 'pid'=>0,),    array('id'=>13, 'pid'=>14,),    array('id'=>17, 'pid'=>15,),    array('id'=>16, 'pid'=>17,),    array('id'=>18, 'pid'=>16,),    array('id'=>19, 'pid'=>15,),);

回复讨论(解决方案)

更新一个版本

/** * 将“邻接列表算法”组织的数据转换成树状数组 * @param array 二维数据数组 * @param int 要查找的父ID * @return array 多维树状数组 */function tree($arr, $parent_id = 0){    $tmp = array();    foreach($arr as $k=>$v) {        list($id, $pid) = array_values($v);        if(isset($tmp[$id])){            $tmp[$id] = array_merge($v, $tmp[$id]);        }else{            $tmp[$id] = $v;        }        $tmp[$pid]['child'][$id] = &$tmp[$id];    }    $list = array();    if(0 == $parent_id){        $list = $tmp[0]['child'];    }else{        $list = $tmp[$parent_id];    }    unset($tmp);    return $res;}

本帖最后由 xuzuning 于 2013-06-09 15:52:20 编辑

我那个是函数吗?肯定不是的!
查询指令有 order by pid, id 子句,就能保证“子数据在父数据之前”的现象不存在

查询的时候排序呗 在数据库里肯定比用程序要快

我那个是函数吗?肯定不是的!
查询指令有 order by pid, id 子句,就能保证“子数据在父数据之前”的现象不存在

不知下面这个数组是否符合 order by pid, id

$arr = array(    array('id'=>13, 'pid'=>0,),    array('id'=>14, 'pid'=>0,),    array('id'=>9, 'pid'=>12,),    array('id'=>10, 'pid'=>13,),    array('id'=>11, 'pid'=>13,),    array('id'=>12, 'pid'=>14,),);

查询的时候排序呗 在数据库里肯定比用程序要快
或许有些时候你会发现数据库排序有多慢


查询的时候排序呗 在数据库里肯定比用程序要快
或许有些时候你会发现数据库排序有多慢 数据库排序慢,是因为没建立索引吧。或者你用数组排序。