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

WBOY
Release: 2016-06-23 14:12:42
Original
856 people have browsed it

递归 树状 无限分类

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

版主大大发表于 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,),);
Copy after login


回复讨论(解决方案)

更新一个版本

/** * 将“邻接列表算法”组织的数据转换成树状数组 * @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;}
Copy after login

本帖最后由 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,),);
Copy after login

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


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

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template