将含有父ID的列表转成树,id列表成树
程序员文章站
2024-01-05 21:14:00
...
将含有父ID的列表转成树,id列表成树
我们知道数据库一般是以一个列表(id,pid)的形式保存树的。如何提取这棵树呢?最简单的方法就是根据pid循环查表。但是毫无疑问,这会产生巨大的数据库查询开销。
那么一般建议的方法是一次性将全部相关数据全查出来,但是这就涉及到一个问题,如何快速的构建一棵树。
我曾经一直以为,这是一个复杂的操作,至少需要一个递归,时间复杂度不会是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 = JSON