PHP +递归菜单树和一个路径

时间:2016-11-07 13:52:01

标签: menu tree html-lists

问候语,

正在处理一个递归的树状菜单,但我却陷入了困境。

递归代码

 $get_parent = "0";
    $rep_1 = mysqli_query($connexion,' SELECT * FROM category');
    $get_array = array();
    while($don_1 = mysqli_fetch_array($rep_1))
    {
    $get_array[$don_1['id']] = array("id" => $don_1['id'], "id_parent" => $don_1['id_parent'], "title" => $don_1['title']);
    }

    function tree_2($array,$parent,$currLevel=0)
    {
    foreach($array as $key => $value)
    {
        if($value['id_parent'] == $parent)
    {
    echo "".str_repeat("-", $currLevel)."id : ".$value['id']." | id_parent : ".$value['id_parent']." | title : ".$value['title']."<br/>";


    $currLevel++;               
    $children = tree_2($array,$key,$currLevel);             
    $currLevel--;
            }
        }
    }
    echo tree_2($get_array,$get_parent);

我的表

== Table structure for table category
|------
|Column|Type|Null|Default
|------
|//**id**//|int(11)|No|
|title|varchar(20)|No|
|id_parent|int(11)|Yes|NULL
|path|varchar(11)|No|
== Dumping data for table category

|1|ELECTRONICS|0|0
|2|TELEVISIONS|1|1
|3|TUBE|2|2
|4|LCD|2|2
|5|PLASMA|2|2
|6|PORTABLE ELECTRONICS|1|1
|7|MP3 PLAYERS|6|2
|8|FLASH|7|2
|9|CD PLAYERS|6|2
|10|2 WAY RADIOS|6|3
|11|PLANS|0|0
|12|SPITFIRE|11|1
|13|MP3 PLAYERS|8|2

这段代码非常好,

但是,当我想只获得一个分支时,我会陷入困境。像

  

FLASH

     
    

CD播放器

         
      

WAY RADIO。

    
  

事实上,我想进入论坛,在那里我们可以回到论坛根目录。喜欢

  

FLASH&gt; CD播放器&gt;无线电广播。

如果有任何想法!

1 个答案:

答案 0 :(得分:1)

经过一番尝试,我终于找到了一个解决方案,从php递归树中只获得一个分支。我正在寻找代码,对于那些正在寻找这种脚本的人来说。

示例来源来自此博客:Managing Hierarchical Data in MySQL

表格来源:

===Database model3

== Table structure for table category

|------
|Column|Type|Null|Default
|------
|//**id**//|int(11)|No|
|title|varchar(20)|No|
|id_parent|int(11)|Yes|NULL
|path|varchar(11)|No|
== Dumping data for table category

|1|ELECTRONICS|0|0
|2|TELEVISIONS|1|1/2
|3|TUBE|2|1/2/3
|4|LCD|2|1/2/4
|5|PLASMA|2|1/2/5
|6|PORTABLE ELECTRONICS|1|1/6
|7|MP3 PLAYERS|6|1/6/7
|8|FLASH|7|1/6/7/8
|9|CD PLAYERS|6|1/6/9
|10|2 WAY RADIOS|6|1/6/10
|11|PLANS|0|0
|12|SPITFIRE|11|11/12
|13|LOW QUALITY|8|1/6/7/8/13

在代码之前,有一些解释:

使用php递归树,我们可以从数组中获取一个带有分支的树,如下所示:

  • ELECTRONICS
    • TELEVISIONS
      • TUBE
      • LCD
      • PLASMA
    • 便携式电子产品
      • MP3播放器
      • FLASH
        • 低质量
      • CD播放器
      • 2 WAY RADIOS
  • PLANS
    • SPITFIRE

我用于样本的非常简单的代码:

$get_parent = "0";
$rep_1 = mysqli_query($connexion,' SELECT * FROM category');
$get_array = array();
while($don_1 = mysqli_fetch_array($rep_1))
{
    $get_array[$don_1['id']] = array("id" => $don_1['id'], "id_parent" => $don_1['id_parent'], "title" => $don_1['title']);
}
mysqli_free_result($rep_1);
function tree($array,$parent,$currLevel=0)
{
    foreach($array as $key => $value)
    {
        if($value['id_parent'] == $parent)
        {
            echo "".str_repeat("-", $currLevel)."title : ".$value['title']."<br/>";
            $currLevel++;
            tree($array,$key,$currLevel);
            $currLevel--;
        }
    }
}
echo tree($get_array,$get_parent);

邻接列表模型非常适合简单的mysql查询,但是,在谷歌搜索几天之后,我发现它是一个真正的头部哈希来检索单个路径,因为我们必须知道最终级别,对于静态菜单它很好,但出于其他目的,如论坛父母或父母页面,我发现这不是处理单一路径的最佳方式。

我在纸上记录了嵌套集模型,这很棒。但我发现在请求INSERT / UPDATE和DELETE时有点乱。

我终于使用路径枚举进行了一些测试:Hierarchical data in MySQL (and other RDBMS)并找到了检索单个路径的解决方案,如下所示:

  • ELECTRONICS
    • 便携式电子产品
      • FLASH
        • 低质量

正在使用的非常简单的代码:

$get_parent = "0";
$rep_1 = mysqli_query($connexion,' SELECT * FROM category WHERE id=7');
$get_array = array();
while($don_1 = mysqli_fetch_array($rep_1))
{
    $explod_array = explode("/",$don_1['path'],9999);
    foreach ($explod_array as $key=>$value)
    {
            $rep_2 = mysqli_query($connexion,' SELECT * FROM category WHERE id="'.$value.'"');
            while($don_2 = mysqli_fetch_array($rep_2))
            {
                $get_array[$don_2['id']] = array("id" => $don_2['id'], "id_parent" => $don_2['id_parent'], "title" => $don_2['title']);
            }
            mysqli_free_result($rep_2);
    }
}
mysqli_free_result($rep_1);
function tree_1($array,$parent,$currLevel=0)
{
    foreach($array as $key => $value)
    {
        if($value['id_parent'] == $parent)
        {
            echo "".str_repeat("-", $currLevel)."id : ".$value['id']." | id_parent : ".$value['id_parent']." | title : ".$value['title']."<br/>";
            $currLevel++;
            tree_1($array,$key,$currLevel);
            $currLevel--;
        }
    }
}
echo tree_1($get_array,$get_parent);

这样,我保持相同的php递归树菜单代码。我没有用一个大查询来收取我的mysql表。

最糟糕的一点是,我将不得不为INSERT / UPDATE AND DELETE查询编写更多代码,但我已经开始研究了它,并且它可以用一些代码来实现。

我希望它会有所帮助。