2016-11-04 38 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>'; 

因此,您可以根據需要更改代碼。以你想要的方式打印它(可能你需要用循環來訪問每個樹節點)