版主大大的不用递归《读取树状数据的方法》有bug,修改版
程序员文章站
2024-02-05 22:30:52
...
递归 树状 无限分类 由于版主的帖子有点久远,在后面回复的话,担心有些同学会看不到,所以单独开这个帖子。
版主大大发表于 2013-02-04 11:46:06 的《读取树状数据的方法》的帖子有bug。
bug描述:当 子数据在 父数据之前出现时,构造失败。
经过修改测试,应该可以正常工作了,欢迎大家使用各种数据进行测试,有问题大家一起探讨。
查询指令有 order by pid, id 子句,就能保证“子数据在父数据之前”的现象不存在
版主大大发表于 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;}
我那个是函数吗?肯定不是的!
查询指令有 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,),);
查询的时候排序呗 在数据库里肯定比用程序要快
或许有些时候你会发现数据库排序有多慢
查询的时候排序呗 在数据库里肯定比用程序要快
或许有些时候你会发现数据库排序有多慢 数据库排序慢,是因为没建立索引吧。或者你用数组排序。