ツリー型ビューの作成

安藤(プログラマー)
演劇もやっていまする。

新年明けましておめでとうございます!!!
安藤ですm(_ _)m
本年もよろしくお願いいたします。

さて僕の自作php掲示板作りも佳境を迎えているわけなのですが、一番悶絶したのはツリー型データの作成です。。
それって何ぞや?っていうと、掲示板に投稿した記事への返信記事、それへの返信記事、さらにそれへの返信記事、というように、入れ子構造状に記事を形成しようっていうやつです。

1

こんな感じに記事を表示したいわけですね!
やり方が分かってしまえば何てことはないのですが、シンプルな答えに辿り着くまで苦労しましたねぇ(*_*)

社長にヒントをもらって、PUSHして、コード見てもらって、ダメをもらって、それを繰り返し。

訳がわからなくなったら、とにかくシンプルに考える。

これを大事にしていこうと思いました。
そうすれば灯台元暗し、答えが見つかる気がします。

さて、コーディングを振り返ってみますと、、、

data.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
・・・
//記事一覧データの取得
function getPostList($con,$table_name,$target_id = 0)
{
    //データの初期化
    $post_list = array();

    //一覧データの取得
    $statement = $con->prepare("SELECT * FROM $table_name WHERE target_id = :target_id ORDER BY id DESC");
    $statement->bindValue(':target_id',$target_id,PDO::PARAM_STR);
    $statement->execute();

    while($row = $statement->fetch(PDO::FETCH_OBJ))
    {
        array_push($post_list,$row);
    }

    //記事一覧データを返却
    return $post_list;
}
・・・

こんな具合に、まずは記事一覧を取得します。
子記事がどの親記事に対する返信なのかを判断するため、テーブルにはtarget_idというカラムを用意。子記事の場合は対象の親記事id、親記事自体の場合は0が入ります。

問題はここからで、どうやって子記事を追加し続けるのかですね。
僕の苦悶の末にたどり着いた処理がこれ!!!!  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
・・・
//ツリー型一覧データの形成
function getTree($con,$table_name,$parent_posts)
{
    //各記事ごとに処理
    foreach($parent_posts as $post)
    {
        //対象の返信一覧を取得し、childrenに挿入
        $post->children = getPostList($con,$table_name,$post->id);

        //取得したchildrenから更に対象の返信一覧の取得、これをループ
        $post->children = getTree($con,$string_table,$file_table,$post->children);
    }

    //ツリー型一覧データを返却
    return $post_data;
}
・・・

こうすることで、各記事ひとつひとつに対し、返信一覧が取得出来る限り、一覧をchilrenに追加し続ける、というループ処理が可能です(^^)

たったこれだけの行なのに。。。
何日間か迷走しちゃいましたw

そろそろ自作での掲示板づくりもおわり!
ブログもあと何回かで終わりそうです。

次のシリーズは、Flamework「Laravel」を扱うことになるかと!
今年はどんどん学ぶぞ〜

皆様にとっても、善き一年となりますように。