欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

将含有父ID的列表转成树,id列表成树_PHP教程

程序员文章站 2022-05-21 22:52:37
...

将含有父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