问候,
我在做一个递归树菜单,但我被一些事情卡住了。
递归代码
$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查询编写更多的代码,但我已经处理过了,只需少量代码就可以实现。
我希望这会有所帮助。