Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类别树递归_Php_Html_Arrays_Recursion_Tree - Fatal编程技术网

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

我需要通过数组递归建立一个类别表。只要深度更深,它就可以正常工作,但一旦深度降低,HTML输出就会错过表的开始

构建数组的PHP代码:

       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>"
    }