PHPとMySQLを使い、登録データをツリー表示したいと思っています。

イメージとしてはWordPressの「ページ」のような表示です。

親記事と子記事の関係性は出来るのですが、孫記事・ひ孫記事…と続いていくと
上手く配列に代入させる事が出来ません。

ヒントとなる参考URLか、ソースのご指摘をいただければと思います。
※ソースは長くなるのでコメント欄に記載します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/11/22 18:54:13
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント100pt

2分木の配列 $node_list を用意し、IDのみを代入する形にしてみました。

$node_list は1次元目の要素にIDを、2次元目の 'next' には隣のIDを、'child' には子どものIDを持ちます。要素がない場合(終端)には NULL を代入します。next や child は、メモリが許す限り増やすことができます。

//2分木を用意する
$node_list = array();
$node_list[0]['next']  = NULL;
$node_list[0]['child'] = NULL;

$sql = "SELECT * FROM test_db ORDER BY parent_id,sort";
$res = mysql_query($sql, $con);

while ($row = mysql_fetch_array($res)) {
    $id = $row['id'];
    $parent_id = $row['parent_id'];
    $name[$id] = $row['name'];
    $node = 0;
    while (TRUE) {
        //子ノードに追加
        if ($node_list[$parent_id]['child'] == NULL) {
            $node_list[$parent_id]['child'] = $id;
            $node_list[$id]['next']  = NULL;
            $node_list[$id]['child'] = NULL;
            break;
        //次ノードに追加
        } else {
            $node = $node_list[$parent_id]['child'];
            if ($node_list[$node]['next'] == NULL) {
                $node_list[$node]['next']  = $id;
                $node_list[$node]['child'] = NULL;
                $node_list[$id]['next']    = NULL;
                $node_list[$id]['child']   = NULL;
                break;
            }
        }
    }
}

ご質問のケースでは、$node_list の内容は下記のようになります。

$node_list[0]['next']  = NULL;
$node_list[0]['child'] = 1;
$node_list[1]['next']  = 2;
$node_list[1]['child'] = 4;
$node_list[2]['next']  = NULL;
$node_list[2]['child'] = NULL;
$node_list[3]['next']  = NULL;
$node_list[3]['child'] = 5;
$node_list[4]['next']  = 3;
$node_list[4]['child'] = NULL;
$node_list[5]['next']  = NULL;
$node_list[5]['child'] = NULL;

これを順番に追ってもらえれば、目的のツリー構造が表現できるのではないかと思います。

id:k27w

ソースを提示していただき、ありがとうございます。


実行してしばらく考えてみましたが、どのようにツリー構造にするか、結構難しいですね。(難しく考えすぎかも知れませんが…)ただ、非常に勉強になりました。


教えていただいたソースを元に、ULリスト表示するツリーを作成したいと思います。

ありがとうございました。

2008/11/22 18:53:25

その他の回答1件)

id:yashida333 No.1

回答回数67ベストアンサー獲得回数2

php+mysqlの掲示板のソースでも参考にされれば

ツリー表示可

http://www.vector.co.jp/soft/unix/net/se209086.html

id:pahoo No.2

回答回数5960ベストアンサー獲得回数633ここでベストアンサー

ポイント100pt

2分木の配列 $node_list を用意し、IDのみを代入する形にしてみました。

$node_list は1次元目の要素にIDを、2次元目の 'next' には隣のIDを、'child' には子どものIDを持ちます。要素がない場合(終端)には NULL を代入します。next や child は、メモリが許す限り増やすことができます。

//2分木を用意する
$node_list = array();
$node_list[0]['next']  = NULL;
$node_list[0]['child'] = NULL;

$sql = "SELECT * FROM test_db ORDER BY parent_id,sort";
$res = mysql_query($sql, $con);

while ($row = mysql_fetch_array($res)) {
    $id = $row['id'];
    $parent_id = $row['parent_id'];
    $name[$id] = $row['name'];
    $node = 0;
    while (TRUE) {
        //子ノードに追加
        if ($node_list[$parent_id]['child'] == NULL) {
            $node_list[$parent_id]['child'] = $id;
            $node_list[$id]['next']  = NULL;
            $node_list[$id]['child'] = NULL;
            break;
        //次ノードに追加
        } else {
            $node = $node_list[$parent_id]['child'];
            if ($node_list[$node]['next'] == NULL) {
                $node_list[$node]['next']  = $id;
                $node_list[$node]['child'] = NULL;
                $node_list[$id]['next']    = NULL;
                $node_list[$id]['child']   = NULL;
                break;
            }
        }
    }
}

ご質問のケースでは、$node_list の内容は下記のようになります。

$node_list[0]['next']  = NULL;
$node_list[0]['child'] = 1;
$node_list[1]['next']  = 2;
$node_list[1]['child'] = 4;
$node_list[2]['next']  = NULL;
$node_list[2]['child'] = NULL;
$node_list[3]['next']  = NULL;
$node_list[3]['child'] = 5;
$node_list[4]['next']  = 3;
$node_list[4]['child'] = NULL;
$node_list[5]['next']  = NULL;
$node_list[5]['child'] = NULL;

これを順番に追ってもらえれば、目的のツリー構造が表現できるのではないかと思います。

id:k27w

ソースを提示していただき、ありがとうございます。


実行してしばらく考えてみましたが、どのようにツリー構造にするか、結構難しいですね。(難しく考えすぎかも知れませんが…)ただ、非常に勉強になりました。


教えていただいたソースを元に、ULリスト表示するツリーを作成したいと思います。

ありがとうございました。

2008/11/22 18:53:25
  • id:k27w
    【データベース構造】

    ▼フィールド
    id、name、parent_id、sort
    ▼フィールドの意味
    記事ID、名前、親記事ID、ソート

    【登録レコード例】

    1|親記事 |0|0|
    2|別親記事|0|1|
    3|子記事01|1|2|
    4|子記事02|1|1|
    5|孫記事 |3|0|

    ▼PHPのソース

    $sql = "SELECT * FROM test_db ORDER BY parent_id,sort";
    $res = mysql_query($sql,$conn);

    while($row = mysql_fetch_array($res,MySQL_ASSOC)){
    $id = $row["id"];
    $parent_id = $row["parent_id"];

    // 親記事がある
    if($parent_id>0){
    $tree[$parent_id][$id]["name"]=$row["name"];
    }else{
    $tree[$id]["name"]=$row["name"]
    ; }
    }


    PHPは5.2.6、MySQLは4.1.22を使っています。
  • id:b-wind
    要点だけ。
    関数化して再帰的に呼び出せばいいと思う。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません
${title} {{if price }}
${price}円
{{/if}}