我使用的是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
树的形式不正确,只有少数评论找到了他们的父母,而不是所有
答案 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;
}
}
}
}
}