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

WBOY
发布: 2016-06-23 14:12:42
原创
858 人浏览过

递归 树状 无限分类

由于版主的帖子有点久远,在后面回复的话,担心有些同学会看不到,所以单独开这个帖子。

版主大大发表于 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,),);
登录后复制

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


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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板