Php 从fetch_assoc()构建注释树(表单mysqli prepare with getresult)

Php 从fetch_assoc()构建注释树(表单mysqli prepare with getresult),php,tree,Php,Tree,我上过一节课 $this->article_id = 14; $this->res = $this->conn->prepare("Select id,name, parent_id FROM Comments WHERE article_id = ? ORDER BY id"); $this->res->bind_param('i', $this->article_id); $this->res->execute(); $this->

我上过一节课

$this->article_id = 14;
$this->res = $this->conn->prepare("Select id,name, parent_id FROM Comments WHERE article_id = ? ORDER BY id");
$this->res->bind_param('i', $this->article_id);
$this->res->execute();
$this->res = $this->res->get_result();
这对……很管用

echo '<ul>';
while($row = $this->res->fetch_assoc()) {
  echo "<li>comment $row[name]-id:$row[id] parent: $row[parent_id]</li>";
}
echo '</ul>';
// Result:
<ul>
  <li>comment foo1-id:1 parent: 0</li>
  <li>comment foo2-id:2 parent: 4</li>
  <li>comment foo3-id:3 parent: 0</li>
  <li>comment foo4-id:4 parent: 1</li>
  <li>comment foo5-id:5 parent: 2</li>
  <li>comment foo6-id:6 parent: 2</li>
  <li>comment foo7-id:7 parent: 5</li>
  <li>comment foo8-id:8 parent: 1</li>
  <li>comment foo9-id:9 parent: 3</li>
  <li>comment foo10-id:10 parent: 1</li>
</ul>
echo'
    '; 而($row=$this->res->fetch\u assoc()){ echo“
  • 注释$row[name]-id:$row[id]parent:$row[parent_id]
  • ”; } 回声“
”; //结果:
  • 注释foo1 id:1父级:0
  • 注释foo2 id:2父项:4
  • 注释foo3 id:3父级:0
  • 注释foo4 id:4父项:1
  • 注释foo5 id:5父项:2
  • 注释foo6 id:6父项:2
  • 注释foo7 id:7父项:5
  • 注释foo8 id:8父项:1
  • 注释foo9 id:9父项:3
  • 注释foo10id:10父项:1
现在我想要一个结果,以树模式显示注释,突出显示注释及其回复…:

<ul>
  <li>comment foo1-id: 1 parent: 0</li>
  <li>
    <ul>
      <li>comment foo4-id: 4 parent: 1</li>
      <li>  
        <ul>
          <li>comment foo2-id:2 parent: 4</li>
          <li>
            <ul>
              <li>comment foo5-id:5 parent: 2</li>
              <li>
                <ul>
                  <li>comment foo7-id:7 parent: 5</li>
                </ul>
              </li>
              <li>comment foo6-id:6 parent: 2</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>comment foo8-id: 8 parent: 1</li>
      <li>comment foo10-id: 10 parent: 1</li>
    </ul>
  </li>
  <li>comment foo3-id: 3 parent: 0</li>
  <li>
    <ul>
      <li>comment foo9-id:9 parent: 3</li>
    </ul>
  </li>      
</ul>
  • 注释foo1 id:1父级:0
    • 注释foo4 id:4父项:1
      • 注释foo2 id:2父项:4
        • 注释foo5 id:5父项:2
          • 注释foo7 id:7父项:5
        • 注释foo6 id:6父项:2
    • 注释foo8 id:8父项:1
    • 注释foo10id:10父项:1
  • 注释foo3 id:3父级:0
    • 注释foo9 id:9父项:3
我尝试了很多解决方案,但效果不好。。。 Whit递归函数,例如:

$comments = array();
while($row = $this->res->fetch_assoc()) {
  $row['children'] = array();
  $comments[$row['id']] = $row;
}
foreach ($comments as $k => &$v) {
  if ($v['parent_id'] != 0) {
    $comments[$v['parent_id']]['children'][] =& $v;
  }
}
unset($v);

// delete the childs comments from the top level
foreach ($comments as $k => $v) {
  if ($v['parent_id'] != 0) {
    unset($comments[$k]);
  }
}

function toUl ($arr) {
    $html = '<ul>' . PHP_EOL;
    foreach ( $arr as $v ) {
        $html.= '<li>comment '.$v['name'].'-id'.$v['id'].' parent: '.$v['parent_id'].'</li>' . PHP_EOL;
        if ( array_key_exists('children', $v) ) {
            $html.= toUL($v['children']);
        }
    }
    $html.= '</ul>' . PHP_EOL;
    return $html;
}

echo toUl($comments);

var_dump($comments):
array(2) {
  [3]=> array(4) {
    ["id"]=> int(3)
    ["parent_id"]=> int(0)
    ["name"]=> string(4) "foo3"
    ["children"]=> array(0) { }
  }
  [1]=> array(4) {
    ["id"]=> int(1)
    ["parent_id"]=> int(0)
    ["name"]=> string(4) "foo1"
    ["children"]=> array(1) {
      [0]=> array(4) {
        ["id"]=> int(4)
        ["parent_id"]=> int(1)
        ["name"]=> string(4) "foo4"
        ["children"]=> array(1) {
          [0]=> array(4) {
            ["id"]=> int(2)
            ["parent_id"]=> int(4)
            ["name"]=> string(4) "foo2"
            ["children"]=> array(0) { }
          }
        }
      }
    }
  }
}
array(2) {
  [3]=> array(4) {
    ["id"]=> int(3)
    ["parent_id"]=> int(0)
    ["name"]=> string(4) "foo3"
    ["children"]=> array(0) { }
  }
  [1]=> array(4) {
    ["id"]=> int(1)
    ["parent_id"]=> int(0)
    ["name"]=> string(4) "foo1"
    ["children"]=> array(1) {
      [0]=> array(4) {
        ["id"]=> int(4)
        ["parent_id"]=> int(1)
        ["name"]=> string(4) "foo4"
        ["children"]=> array(1) {
          [0]=> array(4) {
            ["id"]=> int(2)
            ["parent_id"]=> int(4)
            ["name"]=> string(4) "foo2"
            ["children"]=> array(0) { }
          }
        }
      }
    }
  }
}
$comments=array();
而($row=$this->res->fetch\u assoc()){
$row['children']=array();
$comments[$row['id']]=$row;
}
foreach($k=>&v注释){
如果($v['parent_id']!=0){
$comments[$v['parent_id']['children'][]=&$v;
}
}
未结算(五美元);
//从顶层删除孩子的注释
foreach($k=>v){
如果($v['parent_id']!=0){
未设置($comments[$k]);
}
}
函数toUl($arr){
$html='
    '.PHP\u EOL; 外汇($arr为$v){ $html.='
  • 注释'$v['name'].-id'.$v['id'.'父项:'.$v['parent\u id'..
  • .'.PHP\u EOL; 如果(数组\键\存在('children',$v)){ $html.=toUL($v['children']); } } $html.='
'.PHP\u EOL; 返回$html; } echo toUl(评论); 变量转储($comments): 阵列(2){ [3] =>阵列(4){ [“id”]=>int(3) [“父项id”]=>int(0) [“名称”]=>字符串(4)“foo3” [“子项”]=>数组(0){} } [1] =>阵列(4){ [“id”]=>int(1) [“父项id”]=>int(0) [“名称”]=>字符串(4)“foo1” [“子项”]=>数组(1){ [0]=>阵列(4){ [“id”]=>int(4) [“家长id”]=>int(1) [“名称”]=>字符串(4)“foo4” [“子项”]=>数组(1){ [0]=>阵列(4){ [“id”]=>int(2) [“家长id”]=>int(4) [“名称”]=>字符串(4)“foo2” [“子项”]=>数组(0){} } } } } } } 阵列(2){ [3] =>阵列(4){ [“id”]=>int(3) [“父项id”]=>int(0) [“名称”]=>字符串(4)“foo3” [“子项”]=>数组(0){} } [1] =>阵列(4){ [“id”]=>int(1) [“父项id”]=>int(0) [“名称”]=>字符串(4)“foo1” [“子项”]=>数组(1){ [0]=>阵列(4){ [“id”]=>int(4) [“家长id”]=>int(1) [“名称”]=>字符串(4)“foo4” [“子项”]=>数组(1){ [0]=>阵列(4){ [“id”]=>int(2) [“家长id”]=>int(4) [“名称”]=>字符串(4)“foo2” [“子项”]=>数组(0){} } } } } } }
输出:

<ul>
  <li>comment foo3-id3 parent: 0</li>
  <ul>
  </ul>
  <li>comment foo1-id1 parent: 0</li>
  <ul>
    <li>comment foo4-id4 parent: 1</li>
    <ul>
      <li>comment foo2-id2 parent: 4</li>
      <ul>
      </ul>
    </ul>
  </ul>
</ul>
  • 注释foo3-id3父项:0
  • 注释foo1-id1父项:0
    • 注释foo4-id4父项:1
      • 注释2-id2父项:4

有点不对劲…:-(

不要在fetch\u assoc循环中直接回显结果,尝试在其中定义一个多维数组,然后循环该数组以回显HTML结构。

粘贴一些您尝试过的代码,请查找您可以使用的内容-选中此项:@divaka好的,我已经尝试过了,输出没有任何内容。(
echo toUl($comments)
?您必须回显:)或者您可以将其传递给变量,比如说
$comments\u html=toUl($comments)
,然后
回显$comments\u html