那么一般建议的方法是一次性将全部相关数据全查出来,但是这就涉及到一个问题,如何快速的构建一棵树。
我曾经一直以为,这是一个复杂的操作,至少需要一个递归,时间复杂度不会是o(n)。
前段时间,一个工作上的需求,需要解决这个问题。我仔细想了想,发现完全可以通过单层循环解决这个问题,实现如下:
1 function list2tree($listitem, $idx = 'id', $pidx = 'pid', $childkey= 'list'){ 2 $map = array(); 3 $pmap = array(); 4 5 foreach($listitem as $item){ 6 $id = $item[$idx]; 7 $pid = $item[$pidx]; 8 $map[$id] = &$item; 9 unset($item);10 } 11 12 foreach($map as $id => &$item){13 $pid = $item[$pidx];14 $item[$childkey] = array();15 16 if(! isset($map[$pid])){17 $pmap[$id] = &$item; 18 } 19 else{ 20 $pitem= &$map[$pid];21 $pitem[$childkey][] = &$item;22 } 23 24 unset($item, $pitem);25 }26 27 return array_shift($pmap);28 }
测试一下:
1 // 路径方便识别父子关系 2 $json = < int(1) [path]=> string(3) /se [list]=> array(2) { [0]=> array(4) { [id]=> int(3) [pid]=> int(2) [path]=> string(8) /se/4901 [list]=> array(1) { [0]=> array(4) { [id]=> int(5) [pid]=> int(3) [path]=> string(13) /se/4901/mask [list]=> array(0) { } } } } [1]=> array(4) { [id]=> int(6) [pid]=> int(2) [path]=> string(8) /se/4902 [list]=> array(1) { [0]=> array(4) { [id]=> int(7) [pid]=> int(6) [path]=> string(13) /se/4902/mask [list]=> array(0) { } } } } }}
成功把列表转成了树
http://www.bkjia.com/phpjc/1102845.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1102845.htmltecharticle将含有父id的列表转成树,id列表成树 我们知道数据库一般是以一个列表(id,pid)的形式保存树的。如何提取这棵树呢?最简单的方法就是根据...
