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

php中文网
发布: 2016-06-23 14:12:42
原创
902人浏览过

递归 树状 无限分类

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

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

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


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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号