【问题标题】:Build a Comments Tree from fetch_assoc() (Form mysqli prepare with getresult)从 fetch_assoc() 构建评论树(使用 getresult 准备表单 mysqli)
【发布时间】:2014-01-22 18:00:41
【问题描述】:

我在上课..

$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>

现在我想要一个结果,以树模式显示 cmets 以突出显示 cmets 及其回复...:

<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>

我尝试了很多解决方案,但都无法正常工作... 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) { }
          }
        }
      }
    }
  }
}

输出:

<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>

出了点问题... :-(

【问题讨论】:

  • 请粘贴一些您尝试过的代码
  • 找到你可以使用的东西 - 检查这个:stackoverflow.com/questions/10011194/…
  • @divaka 好的,我已经尝试过了......输出没有任何结果.. :-(
  • echo toUl($comments)?你必须回应它:)
  • 或者你可以将它传递给一个变量,比如说$comments_html = toUl($comments),然后是echo $comments_html

标签: php tree


【解决方案1】:

与其直接在 fetch_assoc 循环中回显结果,不如尝试在其中定义一个多维数组,然后循环遍历该数组以回显 HTML 结构。

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 2014-05-18
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2013-08-30
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多