2016-11-04 39 views
1

如何使用PHP的MySQL创建一个动态的树这个表如何创建一个PHP MySQL的动态树

tbl_folder

db_id db_foldername 
1  accounting 
2  hr 
3  it 

tbl_subfolder

db_id db_folderid db_subfoldername 
1  1   xxx 
2  1   yyy 
3  2   zzz 

tbl_childsubfolder

db_id db_subfolderid db_childsubfoldername 
1  1    ffff 
2  2    llll 

tbl_subchild

db_id db_childsubfolderid db_subchildname 
1   1      eee 
2   1      ppp 
    • XXX

      • FFF
        • EEE
        • PPP
    • YYY

      • LLL
  • 小时

    • ZZZ
  • 包括( “包括/ connect.php”); - 选择 - $名称“; }
    ?>

    if(isset($_POST['add'])){ 
        $foldername=$_POST['txt_name']; 
        $select=$_POST['txt_select'];echo $select; 
        $explod=explode("-",$select); 
        $path=$explod['0'].';'.$explod['1']; 
        if($path==";"){$path="";} 
        $parent_id=$explod['1']; 
        if($foldername==""){echo"enter a name";} 
        else{ 
        $insert_query=mysqli_query($conn,"insert into tbl_folders(parent_id,path,name)values('$parent_id','$path','$foldername')")or die(mysqli_error($conn)); 
         header("location:index.php"); 
        } 
    } 
    
    
    $sql=mysqli_query($conn,"select * from tbl_folders where parent_id='0'")or die(mysqli_error($conn)); 
    while($row=mysqli_fetch_array($sql)){ 
        $name=$row['name']; 
        $id=$row['db_id']; 
        echo $name;echo"<br/>"; 
        $sqli=mysqli_query($conn,"select * from tbl_folders where parent_id='$id'")or die(mysqli_error($conn)); 
        while($row=mysqli_fetch_array($sqli)){ 
        $name=$row['name']; 
        $id=$row['db_id']; 
        $path=$row['path']; 
        $x=explode(";",$path);echo $path;echo"<br/>"; 
        $pa=$x['1']; 
        echo $name;echo"<br/>"; 
        $sqli=mysqli_query($conn,"select * from tbl_folders where parent_id='$id' and path='$pa'")or die(mysqli_error($conn)); 
        while($row=mysqli_fetch_array($sqli)){ 
         $name=$row['name']; 
        $id=$row['db_id']; 
        $path=$row['db_path'];  
        echo $name;echo"<br/>";} 
        } 
    } 
    
+0

它没有必要使用这么多的表......只有一张表是绝对足够的 – krasipenkov

+0

@krasipenkov我该怎么做用一张桌子?! – m7md

+0

@krasipenkov谢谢你提供这些重要的信息,但如果我想打印我的树,我该怎么做?! – m7md

回答

1

构建树

您可以创建一个表具有以下字段:

`id (int), parent_id (int), path (vachar), name` 

ID - 是标识符 PARENT_ID - 指t o在同一个表 路径中的父的id - 是父ID的给定元素在表中

实施例的条目的路径:

|id | parent_id | path | name| 
------------------------------- 
|1 | 0   |  | A | 
------------------------------- 
|2 | 1   |;1; | B | 
------------------------------- 
|3 | 2   |;1;2; | C | 

其中A是父,B是子A和C是B的子项。

在您的后端逻辑中,您需要具有以下内容: 当您在此表中添加/编辑新项目时 - 如果它是根父级(没有上级父项)它与parent_id=0path='' 当您在此ta中添加/编辑新项目时BLE - 如果它有父,那么你用parent_id=:idOfParentpath=CONCAT(:parentPath, ';', :idOfParent, ';') 其中:idOfParent插入 - 是价值父ID和:parentPath是你与;:idOfParent; ;串联父路径 - 是在路径

的ID分隔

“路径”列可让您直接获取给定元素的所有父项而无需使用递归方法。 所以如果你选择一个项目的路径'; 1; 2; 3;'并且您还需要父母的信息,您还将拥有1 + 3 SELECT查询总数。

和删除一个项目时,你可以这样做:

DELETE FROM table WHERE path LIKE (';:deleteId;') 

其中​​是删除的元素的ID。该查询将删除已删除项目作为父项目的所有条目。

可视化树的

你可以得到$与此查询

'SELECT id, parent_id, path, name FROM table WHERE 1;' 

但对于测试我使用下面的示例阵列

$data = [ 
    0 => ['id' => 1, 'parent_id' => 0, 'path' => '', 'name' => 'A'], 
    1 => ['id' => 2, 'parent_id' => 1, 'path' => ';1;', 'name' => 'B'], 
    2 => ['id' => 3, 'parent_id' => 2, 'path' => ';1;2;', 'name' => 'C'], 
    3 => ['id' => 4, 'parent_id' => 3, 'path' => ';1;2;3;', 'name' => 'D'], 

    4 => ['id' => 5, 'parent_id' => 1, 'path' => ';1;', 'name' => 'E'], 
    5 => ['id' => 6, 'parent_id' => 2, 'path' => ';1;2;', 'name' => 'G'], 
    6 => ['id' => 7, 'parent_id' => 0, 'path' => '', 'name' => 'H'], 
]; 

$ref = null; 
$tree = []; 
foreach($data as $item) { 
    if($item['path']) { 
     $path = ltrim($item['path'], ';'); 
     $path = rtrim($path, ';'); 
     $pathArray = explode(';', $path); 

     $i = 0; 
     foreach($pathArray as $parentId) { 
      if($i === 0) { 
       if(!isset($tree[$parentId])) {$tree[$parentId] = ['name' => [], 'children' => []];} 
       $ref = &$tree[$parentId]['children']; 
      } 
      else { 
       if(!isset($ref[$parentId])) $ref[$parentId] = ['name' => [], 'children' => []]; 
       $ref = &$ref[$parentId]['children']; 
      } 
      $i++; 
     } 

     if($ref !== null) { 
      $ref[$item['id']]['name'] = $item['name']; 
      $ref[$item['id']]['children'] = []; 
     } 
    } 
    else { 
     $tree[$item['id']]['name']  = $item['name']; 
     $tree[$item['id']]['children'] = []; 
    } 
} 

输出部分数据:

print '<pre>'; 
print_r($tree); 
print '</pre>'; 

因此,您可以根据需要更改代码。以你想要的方式打印它(可能你需要用循环来访问每个树节点)