在PHP中将所有行元素打印为树


Printing down all row elements as tree in PHP

我构建了一个数据库,其中有一个名为"tasks"的表。表任务负责按任务的第一次进入日期的顺序保存任务。Tasks表有一个名为"parent"的列。此父列允许用户在另一个任务下创建新任务。例如,我们有一个任务,它的id是21。当我们在21任务下创建一个新的"子"任务时,我们将新任务的父列设置为21;说明新任务是21世纪任务下的任务。我附上了一张桌子的图片,这样就更容易理解发生了什么。https://i.stack.imgur.com/M9cmZ.jpg

我试图用所有这些任务来实现的是,我希望它们打印成树,如果可以的话,是一个无序的列表。列表的结构如下:

<ul id="tree">
        <li><a href="#">A root Task</a>
            <ul>
                <li><a href="#">child of first task</a>
                    <ul>
                        <li><a href="#">grandchildren of first child</a></li>
                        <li><a href="#">grandchildren of first child</a></li>
                    </ul>                           
                </li>
                <li><a href="#">child of first task</a></li>
                <li><a href="#">child of first task</a>
                    <ul>
                        <li><a href="#">grandchildren of first child</a></li>
                        <li><a href="#">grandchildren of first child</a></li>
                        <li><a href="#">grandchildren of first child</a></li>
                    </ul>                           
                </li>
                <li><a href="#">child of first task</a>
                    <ul>
                        <li><a href="#">grandchildren of first child</a></li>
                    </ul>                           
                </li>
                <li><a href="#">child of first task</a></li>
            </ul>                   
        </li>
</ul>

我想出了几个主意,但没有一个奏效。有什么想法吗?

上例中的根任务是任务表中其父值为0的任务。可能会有很多这样的无父任务,并且在另一个任务下创建任务是没有限制的。

也许你已经想到了。。但是

我想到的第一个想法是一个简单的函数,它返回与给定parent_id匹配的所有子项。。

因此,第一个调用是get_childs(0),他将使用parent_id='0'返回所有Task。

每一个,都会再次调用相同的函数,上面有他的父母id。如果其中一个主任务具有id=50,并且表中存在parent_id=50,则它们将在其父任务下打印。

function get_childs($parent_id){
     if ($result = $mysqli->query("SELECT * FROM table WHERE parent_id='".$parent_id."'")) {
         echo '<ul>';
         while ($row = $result->fetch_assoc()) {
             echo '<li><a href="#">'.$row['name'].'</a>';
             //call again for each child. if the id dosen't have childs, then prints nothing and go on!
             get_childs($row['id']);
             echo '</li>';
        }// end while
        echo '</ul>';
     }// end if select
} // end function

希望它能有所帮助!