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



问候,

我在做一个递归树菜单,但我被一些事情卡住了。

递归代码

 $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播放器

双向无线电。

事实上,我想做喜欢进入论坛,在那里我们可以找到返回论坛根的路径。像

FLASH>CD播放器>WAY收音机。

如果有任何想法!

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

示例来源于此博客:在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递归树,我们可以从数组中获得一个带有分支的树,如下所示:

  • 电子学
    • 电视机
      • 管子
      • 液晶显示器
      • 等离子体
    • 便携式电子设备
      • MP3播放器
      • 闪光
        • 低质量
      • CD播放器
      • 双向收音机
  • 计划
    • 喷火

我用于示例的非常简单的代码:

$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);

The Adjacency List Model非常适合简单的mysql查询,然而,在谷歌搜索了几天后,我发现它是检索单一路径的一个真正的头部散列,我们必须知道它的最终级别,对于静态菜单来说它很好,但对于论坛父级或页面父级等其他目的,我发现这不是检索单一路径处理的最佳方式。

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

最后,我对路径枚举进行了一些测试:MySQL(和其他RDBMS(中的分层数据,并找到了一个检索单一路径的解决方案,如下所示:

  • 电子学
    • 便携式电子设备
      • 闪光
        • 低质量

我使用的非常简单的代码:

$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/UPDATEANDDELETE查询编写更多的代码,但我已经处理过了,只需少量代码就可以实现。

我希望这会有所帮助。

最新更新