3

私はこのように私のサイトにコメントを表示したいと思います:

<li>Parent
    <ul>
        <li>child one</li>
        <li>child two
            <ul>
                <li>grandchild</li>
                <li>other grandchild</li>
            </ul>
        </li>
     </ul>
<li>Another parent with no children</li>
<li>

次の記事を読みましたが、使用していません<li>。それで、私が以前に行ったようなコメントをそのような配列で表示する方法はありますか?ありがとう。

$comments = array(
      array('id'=>1, 'parent_id'=>NULL,   'text'=>'Parent'),
      array('id'=>2, 'parent_id'=>1,      'text'=>'Child'),
      array('id'=>3, 'parent_id'=>2,      'text'=>'Child Third level'),
      array('id'=>4, 'parent_id'=>NULL,   'text'=>'Second Parent'),
      array('id'=>5, 'parent_id'=>4,      'text'=>'Second Child')
);
4

3 に答える 3

4

コメントテーブルにはid、parent_id、comment、...があると思いますが、私の提案は次のようになります。

次のようなコメントを選択してください。

$sql = "SELECT *FROM comments ORDER BY id DESC";

$rows = mysql_query($sql);

そして次のステップは配列操作です。以下のコードを見て、ここでデモを試してみてください。

$rows = your_select_result;//I assumed that you have done these stuffs
$comments = $row;
/**
This is test data, please remove this array while you are
running own application.Since you will use the data one you get your db
**/
$comments = array(
    1 => array('id' => 1, 'parent_id' => 0, 'childs' => array()),
    2 => array('id' => 2, 'parent_id' => 0, 'childs' => array()),
    3 => array('id' => 3, 'parent_id' => 0, 'childs' => array()),
    5 => array('id' => 5, 'parent_id' => 0, 'childs' => array()),
    11 => array('id' => 11, 'parent_id' => 0, 'childs' => array()),
    17 => array('id' => 17, 'parent_id' => 0, 'childs' => array()),
    23 => array('id' => 23, 'parent_id' => 0, 'childs' => array()),
    28 => array('id' => 28, 'parent_id' => 0, 'childs' => array()),
    4 => array('id' => 4, 'parent_id' => 1, 'childs' => array()),
    6 => array('id' => 6, 'parent_id' => 1, 'childs' => array()),
    8 => array('id' => 8, 'parent_id' => 2, 'childs' => array()),
    9 => array('id' => 9, 'parent_id' => 2, 'childs' => array()),
    7 => array('id' => 7, 'parent_id' => 3, 'childs' => array()),
    12 => array('id' =>12, 'parent_id' => 7, 'childs' => array()),
    13 => array('id' => 13, 'parent_id' => 12, 'childs' => array()),
);

/** Comment prepare start */
foreach ($comments as $k => &$v) {
    if ($v['parent_id'] != 0) {
        $comments[$v['parent_id']]['childs'][] =& $v;
    }
}
unset($v);

foreach ($comments as $k => $v) {
    if ($v['parent_id'] != 0) {
        unset($comments[$k]);
    }
}

/** Comment prepare end */

//Your indent pattern
function indent($size) {
    $string = "";
    for ($i = 0; $i < $size; $i++) {
        $string .= "#";
    }
    echo $string; 
}


function printComments($comments, $indent = 0) {
    foreach ($comments as $comment) {
        echo indent($indent + 1).' I am comment '.$comment['id']."\n";
        if (!empty($comment['childs'])) {
            printComments($comment['childs'], $indent + 1);
        }
        }
}


printComments($comments);

デモについては、こちらをご覧ください

于 2012-04-29T09:03:33.167 に答える
2

ところで、具体化されたパス手法を使用する場合、再帰もネストされた配列も必要ありません。

データベースからの単純な線形出力。

これを行うには、データベースに指定されたフィールドを作成し、pathすべての親 ID を入力して、十分な長さにパディングします。

たとえば、ツリーの例は次のようになります

id 1 root path 
    id 3 root 1 path 000000001
        id 5 root 1 path 000000001000000003
    id 4 root 1 path 000000001
id 2 root path 000000002
    id 6 root 2 path 

したがって、単純にテーブルをクエリするORDER BY root DESC, path ASC
と、ツリーが単純な順序付けられたリストとして取得されます

于 2012-04-30T10:01:37.713 に答える
0

この関数は、各コメントの配列に存在するキーとキーparent_idのみを必要とします。id

$comments = array(
            array('id'=>1, 'parent_id'=>NULL, 'text'=>'Parent'),
            array('id'=>2, 'parent_id'=>1,    'text'=>'Child'),
            array('id'=>3, 'parent_id'=>2,    'text'=>'Child Third level'),
            array('id'=>4, 'parent_id'=>NULL, 'text'=>'Second Parent'),
            array('id'=>5, 'parent_id'=>4,    'text'=>'Second Child')
        );

これにより、多次元配列が返されます。1つのアイテムに子がない場合は、$comment['children']に等しくNULLなります。それ以外の場合は、それぞれの子の配列がアタッチされます。

function arrangecomments($comments){

    $tree = array();

    /* We get all the parent into the tree array */
    foreach ($comments as &$node) {
        /* Note: I've used 0 for top level parent, you can change this to == 'NULL' */
        if($node['parent_id']=='0'){
            $tree[] = $node;
            unset($node);
        }
    }

    /* This is the recursive function that does the magic */
    /* $k is the position in the array */
    function findchildren(&$parent, &$comments, $k=0){
        if (isset($comments[$k])){
            if($comments[$k]['parent_id']==$parent['id']){
                $com = $comments[$k];
                findchildren($com, $comments); // We try to find children's children
                $parent['children'][] = $com;
            }
            findchildren($parent, $comments, $k+1); // And move to the next sibling
        }
    }

    /* looping through the parent array, we try to find the children */
    foreach ($tree as &$parent) {
        findchildren($parent, $comments);
    }

    return $tree;

}

大幅に改善できることはわかっていますが、機能しており、これまでのところバグは見つかりませんでした。それが役に立てば幸い!

于 2012-05-27T21:43:00.267 に答える