1

「タスク」というテーブルを持つデータベースを構築しました。テーブル タスクは、タスクを最初のエントリ日順に保持する役割を果たします。Tasks テーブルには、「親」という名前の列があります。この親列により、ユーザーは別のタスクの下に新しいタスクを作成できます。たとえば、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 であるタスク テーブルからのタスクです。親のないタスクが多数存在する可能性があり、別の下にタスクを作成することに制限はありません。

4

1 に答える 1

2

Maybe you have thought of that.. but..

The first idea that comes to my mind is a simple function that returns all the childs that match with the given parent_id..

So, the first call is get_childs(0), and he will return all the Tasks with parent_id='0'.

And each one, will call again the same function, with his parents id on it. If one of the main tasks has id=50, and in the table exists parent_id=50, they will print under his parent.

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

Hope it helps!

于 2013-08-01T09:06:52.297 に答える