gpt4 book ai didi

php - 如何创建一个php mysql动态树

转载 作者:行者123 更新时间:2023-11-28 23:23:36 24 4
gpt4 key购买 nike

如何使用 php mysql 为这个表创建一个动态树

文件夹

db_id   db_foldername
1 accounting
2 hr
3 it

tbl_子文件夹

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

tbl_child子文件夹

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
        • 点对点
    • 年年

  • 小时

    • zzz
  • include("include/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/>";}
    }
    }

最佳答案

构建树

您可以使用以下字段构建一个表:

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

id - 是标识符parent_id - 指的是父表在同一张表中的idpath - 是父 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='' 插入它当您在此表中添加/编辑新项目时 - 如果它有父项,则您使用 parent_id=:idOfParentpath=CONCAT(:parentPath, ';', :idOfParent, ' ;')其中 :idOfParent - 是父 ID 值,:parentPath 是您与 ;:idOfParent; 连接的父路径; - 是路径中 id 的分隔符

路径列为您提供了直接获取给定元素的所有父元素的优势,而无需使用递归方法。因此,如果您选择路径为“;1;2;3;”的项目并且您需要 parent 的信息,您总共会有 1 + 3 SELECT 查询。

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

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

其中 :deletedId 是被删除元素的 id。此查询将删除所有已删除项作为父项的条目。

树的可视化

你可以用这个查询得到$data

'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>';

所以这里你根据自己的需要更改代码。以你想要的方式打印它(可能你需要递归访问每个树节点)

关于php - 如何创建一个php mysql动态树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40417584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com