PHP:无法制作评论树

时间:2017-04-06 11:23:15

标签: php mysql

我使用的是php5和mysql 5.6

我的任务是制作一个评论树,并将其全部作为json。每个注释都有其ID所属的ID和ID,名为rootId。 我通过datetime获得DB排序的评论。

我所做的解决方案只能按降序运行。按升序排列树形状不正确。事情是我需要按升序显示评论。

如果以前有人这样,请帮我解决问题

这是我的代码:

// $result - associative array with all comments

for ($i = 0; $i < $arrayLength; ++$i){
    if ($result[$i]['rootid'] != 0){
        for ($j = 0; $j < $arrayLength; ++$j){
            if ($result[$j]['id'] == $result[$i]['rootid']){
                if ($result[$j]['child'] != 0){ // the case when there's at least 1 child
                    $result[$j]['child'][] = $result[$i];
                }
                else {
                $result[$j]['child'] = $result[$i]; // case when no children
                }
                break;
            }
        }
        unset($result[$i]);
    }
}

这是我得到的一个小例子。

[
  {
"id": "652061",
"rootid": "0",
"date_add": "2017-03-18 22:40:31",
"child": [
  {
    "id": "652063",
    "rootid": "652061",
    "date_add": "2017-03-18 22:58:54",
    "child": [
      {
        "id": "652072",
        "rootid": "652063",
        "date_add": "2017-03-18 23:13:54",
        "child": [
          {
            "id": "652118",
            "rootid": "652072",
            "date_add": "2017-03-19 08:03:36",
            "child": []
          }
        ]
      }
    ]
  }
]
  },
  {
"id": "651999",
"rootid": "0",
"date_add": "2017-03-18 19:26:10",
"child": [
  {
    "id": "652104",
    "rootid": "651999",
    "date_add": "2017-03-19 01:17:32",
    "child": []
  },
  {
    "id": "652066",
    "rootid": "651999",
    "date_add": "2017-03-18 23:02:26",
    "child": []
  }
]

}     ]

但是如果我改变了sql请求

ORDER BY datetime ASC

树的形式不正确,只有少数评论找到了他们的父母,而不是所有

1 个答案:

答案 0 :(得分:0)

解决了这个问题。如果有人会遇到这样的问题 - 这就是解决方案。我知道有很多方法可以用较少的代码行来完成它,但在这里我想展示算法的工作原理。它的工作速度也很慢,可能是因为周期很多。

    $comments = array(
        array(
            'id' => '1',
            'rootid' => '0',
            'child' => array(),
        ),
        array(
            'id' => '2',
            'rootid' => '1',
            'child' => array(),
        ),
        array(
            'id' => '3',
            'rootid' => '2',
            'child' => array(),
        ),
        array(
            'id' => '4',
            'rootid' => '0',
            'child' => array(),
        ),
        array(
            'id' => '5',
            'rootid' => '4',
            'child' => array(),
        ),
        array(
            'id' => '6',
            'rootid' => '4',
            'child' => array(),
        ),
        array(
            'id' => '7',
            'rootid' => '3',
            'child' => array(),
        ),array(
            'id' => '8',
            'rootid' => '3',
            'child' => array(),
        ),array(
            'id' => '9',
            'rootid' => '7',
            'child' => array(),
        ),array(
            'id' => '10',
            'rootid' => '7',
            'child' => array(),
        ),
    );

    $arrayLength = sizeof($comments);

    function goDeeper(&$array, $comm, $arrayLength){
        for ($i = 0; $i < $arrayLength; ++$i){
            if ($array[$i]['id'] == $comm['rootid']){
                if ($array[$i]['child'] != 0 ){
                    $array[$i]['child'][] = $comm;
                }
                else {
                    $array[$i]['child'] = $comm;
                }
                return true;
            }
            else {
                if ($array[$i]['child'] != 0){
                    $success = goDeeper($array[$i]['child'], $comm, $arrayLength);
                    if ($success == true) {
                        return true;
                    }
                }
            }
        }
    }


    for ($i = 0; $i < $arrayLength; ++$i) {
        if ($comments[$i]['rootid'] != 0) {
            for ($j = 0; $j < $arrayLength; ++$j) {
                if ($comments[$j]['child'] != 0) {
                    if ($comments[$j]['id'] == $comments[$i]['rootid']) {
                        $comments[$j]['child'][] = $comments[$i];
                        unset($comments[$i]);
                        break;
                    } else {
                        $success = goDeeper($comments[$j]['child'], $comments[$i], $arrayLength);
                        if ($success == true) {
                            unset($comments[$i]);
                            break;
                        }
                    }
                }
                else {
                    if ($comments[$j]['id'] == $comments[$i]['rootid']){
                        $comments[$j]['child'] = $comments[$i];
                        unset($comments[$i]);
                        break;
                    }
                }
            }
        }
    }