PHP类别树递归
我需要通过数组递归建立一个类别表。只要深度更深,它就可以正常工作,但一旦深度降低,HTML输出就会错过表的开始 构建数组的PHP代码:PHP类别树递归,php,html,arrays,recursion,tree,Php,Html,Arrays,Recursion,Tree,我需要通过数组递归建立一个类别表。只要深度更深,它就可以正常工作,但一旦深度降低,HTML输出就会错过表的开始 构建数组的PHP代码: if($query->rowCount() > 0) { while($result = $query->fetch(PDO::FETCH_OBJ)) { $tree[] = $result; } $childs = array(); for
if($query->rowCount() > 0) {
while($result = $query->fetch(PDO::FETCH_OBJ)) {
$tree[] = $result;
}
$childs = array();
foreach($tree as $item) {
$childs[$item->parent_id][] = $item;
}
foreach($tree as $item) {
if (isset($childs[$item->id])) {
$item->childs = $childs[$item->id];
}
}
$tree = $childs[0];
}
else {
// no category blabla
}
下面是构建表的函数。它不能正常工作
function draw($tree) {
echo "<table border='1' width='300'>";
echo "<tr>";
echo "<td>Name</td><td>Depth</td><td>Parent</td>";
echo "</tr>";
foreach($tree as $key => $value) {
echo "<tr>";
echo "<td>".$value->name."</td>";
echo "<td>".$value->depth."</td>";
echo "<td>".$value->parent_id."</td>";
echo "</tr>";
if(isset($value->childs)) {
draw($value->childs);
}
}
echo "</table>";
}
函数图($tree){
回声“;
回声“;
回显“NameDepthParent”;
回声“;
foreach($key=>$value的树){
回声“;
回显“$value->name.”;
回声“$value->depth.”;
回显“$value->parent_id.”;
回声“;
如果(设置($value->childs)){
抽取($value->childs);
}
}
回声“;
}
根据请求,HTML输出代码段:
<table border='1' width='300'>
<tr>
<td>Name</td>
<td>Depth</td>
<td>Parent</td>
</tr>
<tr>
<td>Bad</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>Good</td>
<td>5</td>
<td>5</td>
</tr>
</table>
<!--- BREAK HAPPENS HERE----->
<tr>
<td>Both?</td>
<td>4</td>
<td>3</td>
</tr>
<table border='1' width='300'>
<tr>
<td>Name</td>
<td>Depth</td>
<td>Parent</td>
</tr>
<tr>
<td>dsadas</td>
<td>5</td>
<td>16</td>
</tr>
</table>
名称
深度
父母亲
坏的
5.
5.
好
5.
5.
二者都
4.
3.
名称
深度
父母亲
达达斯
5.
16
函数图($tree){
如果(!$tree)返回;
$nextLevel=array();
回声“;
回声“;
回显“NameDepthParent”;
回声“;
foreach($key=>$value的树){
回声“;
回显“$value->name.”;
回声“$value->depth.”;
回显“$value->parent_id.”;
回声“;
如果(设置($value->childs)和(&$value->childs){
$nextLevel=array\u merge($nextLevel,$value->childs);
}
}
回声“;
抽签($nextLeveL);
}
这样做:
echo”“;
如果(设置($value->childs)){
抽取($value->childs);
}
回声“”
改为这样做:
if(isset($value->childs)) {
echo "<tr><td colspan='3'>";
draw($value->childs);
echo "</td></tr>"
}
if(设置($value->childs)){
回声“;
抽取($value->childs);
回声“”
}
您正在表格正文中创建一个新表格。这是无效的HTML。你必须把它放在它自己的TD中。你介意在你的foreach和if语句周围添加花括号来检查它是否按预期工作,以明确你的意思吗?在FOREACH之后立即使用IF可能是意外或故意的。请用大括号{}澄清一下,你为什么有回声“;在绘图上方($value->childs);?把那张桌子扔掉tag@MyStream数组创建作为intendet工作。树数组的var_转储与它应该的完全相同,因此这不是问题所在。hackartist:我忘了补充一点,每次表格跳入一个新的深度时,它都应该用它重新发布表格标题。这就是为什么最后一张桌子在那里。编辑:即使在删除它之后,也会发生相同的表格中断,所以这不是问题所在either@Sepix:它仍然很难阅读(并且不是维护性的良好实践(sidepoint))-和“应该是”,但具体在哪里(什么级别)您是否得到意外的html输出?首先循环,没有子项?html标记成对出现。在绘图中,您打开了一个表,但至少有一个表关闭,但可能有更多表关闭..这是不平衡的。这一个可以正常工作,但打印的表不是真正的树。它首先列出所有的层1,然后列出所有的层2,然后列出所有的层第二层。我有你的结果,以及它在这里的最终外观:第二层当然应该在不打破底部的情况下发生:)。我不是在创建它。脚本是问题所在。我知道HTML代码应该是什么样子的问题是要将它教给递归PHP函数。:@Sepix:基于DaanTimmer说,尽管如此,尝试添加相同的代码,但是将tr/td colspan=3放在if(isset()){block,它应该用一个td来包装内部输出-这应该是下一个td?这实际上几乎有效!难以置信。现在唯一的问题是,当他进入外层时,表格上没有标题。图片:好的。我最终解决了它,但这明确地给了我一个我需要理解t的提示他递归的东西。非常感谢……经过40个小时的挣扎,我终于可以正常睡觉了!@Sepix,没问题。我会用MyStream说的话来改变我的答案。他确实是对的,我的错!
echo "<tr><td colspan='3'>";
if(isset($value->childs)) {
draw($value->childs);
}
echo "</td></tr>"
if(isset($value->childs)) {
echo "<tr><td colspan='3'>";
draw($value->childs);
echo "</td></tr>"
}