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

时间:2013-08-01 08:45:41

标签: php mysql algorithm tree html-lists

我构建了一个包含名为“tasks”的表的数据库。表任务负责按照第一个输入日期的顺序保存任务。 Tasks表有一个名为“parent”的列。此父列允许用户在另一个任务下创建新任务。例如,我们有一个任务,它的id是21.当我们在第21个任务下创建一个新的“子”任务时,我们将新任务的父列设置为21;这意味着新任务是第21任务下的任务。我包含了一张桌子图像,以便更容易理解正在发生的事情。 http://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.可能有很多这些任务,无父任务,并且在另一个下创建任务没有限制。

1 个答案:

答案 0 :(得分:1)

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

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

因此,第一个电话是get_childs(0),他将使用parent_id='0'返回所有任务。

每个人都会再次打电话给同一个人,他父母的身份就在上面。 如果其中一个主要任务有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

希望它有所帮助!