Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Schritte zur Implementierung einer unbegrenzten Kommentarverschachtelung in PHP

Detaillierte Erläuterung der Schritte zur Implementierung einer unbegrenzten Kommentarverschachtelung in PHP

php中世界最好的语言
php中世界最好的语言Original
2018-05-16 15:51:442436Durchsuche

Dieses Mal werde ich Ihnen die Schritte zum Implementieren einer unbegrenzten Kommentarverschachtelung in PHP ausführlich erläutern. Was sind die Vorsichtsmaßnahmen für die Implementierung einer unbegrenzten Kommentarverschachtelung in PHP? sehen.

Während des Entwurfs von BB habe ich darüber nachgedacht, ob es möglich ist, eine unendliche Klassifizierungsstrukturanzeige und eine Eltern-Kind-Struktursuche ohne Rekursion zu erreichen, denn wenn der Algorithmus hier nicht optimiert ist, kann dies Konsequenzen haben tödlich! Stellen Sie sich vor, wenn ein Artikel 300 Kommentare enthält, muss die Datenbank gemäß dem normalen rekursiven Algorithmus mindestens 301 Mal abgefragt werden, und zwar ohne Verschachtelung, wenn eine oder zwei Verschachtelungsebenen vorhanden sind oder die Anzahl der Kommentare 1.000 überschreitet , dann stürzt die Datenbank nicht direkt ab?
Tatsächlich können uns die leistungsstarken Array-Verarbeitungsfunktionen von PHP bereits dabei helfen, dieses Problem schnell und bequem zu lösen. Das Bild unten zeigt eine auf unendlicher Ebene klassifizierte

Datenbankstruktur:

IDparentID newsID meldet
108 Kommentare mit der Artikel-ID 8
21 8 Antworten auf Kommentare mit der ID 1
328 Antworten auf den Kommentar mit der ID 2

Um den Kommentar mit der Artikelnummer 8 im Frontend verschachtelt anzuzeigen, müssen wir tatsächlich nur einmal die Datenbank abfragen, nämlich „SELECT * FROM TABLE“. WHERE newsID=8" und überlassen Sie die spätere rekursive Arbeit dem leistungsstarken PHP-Array. Das Problem, das hier auftreten kann, ist die Neuorganisation der strukturellen Beziehung des Arrays, das heißt, alle Kommentare, die in der Kategorie der ersten Ebene verbleiben, werden unter ihrer eigenen parentID abgelegt, um das untergeordnete Element zu bilden.
Ich werde diesen Code unten in die BBCComment-Klasse einfügen. Ich hoffe, meine Ideen mit Ihnen teilen zu können und hoffe, dass jeder bessere und effizientere Algorithmen entwickeln kann.

Methode eins

/** 
 * 按ID条件从评论数组中递归查找 
 * 
 */ 
function getCommentsFromAryById($commtAry, $id) 
{ 
 if ( !is_array($commtAry) ) return FALSE; 
 foreach($commtAry as $key=>$value) { 
  if ( $value['id'] == $id ) return $value; 
  if ( isset($value['children']) && is_array($children) ) $this->getCommentsFormAryById($value['children'], $id); 
 } 
} 
/** 
 * 追加 子评论 到 主评论 中,并形成children子项 
 * 
 * @param array $commtAry 原评论数据引用 
 * @param int $parentId 主评论ID 
 * @param array $childrenAry 子评论的值 
 */ 
function addChildenToCommentsAry($commtAry, $parentId, $childrenAry) 
{ 
 if ( !is_array($commtAry) ) return FALSE; 
 foreach($commtAry as $key=>$value) { 
  if ( $value['id'] == $parentId ) { 
   $commtAry[$key]['children'][] = $childrenAry; 
   return TRUE; 
  } 
  if ( isset($value['children']) ) $this->addChildenToCommentsAry($commtAry[$key]['children'], $parentId, $childrenAry); 
 } 
} 
 $result = $this->BBDM->select($table, $column, $condition, 0, 1000); 
 /* 开始进行嵌套评论结构重组 */ 
 array_shift($result); 
 $count = count($result); 
 $i  = 0; 
 while( $i<$count ) { 
  if ( &#39;0&#39; != $result[$i][&#39;parentId&#39;] ) { 
   $this->addChildenToCommentsAry($result, $result[$i][&#39;parentId&#39;], $result[$i]); 
   unset($result[$i]); 
  } 
  $i++; 
 } 
 $result = array_values($result); 
 /* 重组结束 */

Implementierungsmethode zwei

Der Kerncode ist ein Auszug aus WordPress

<?php
$comments = array (
  array (
    &#39;id&#39; => &#39;3&#39;,
    &#39;parent&#39; => &#39;0&#39;
  ),
  array (
    &#39;id&#39; => &#39;9&#39;,
    &#39;parent&#39; => &#39;0&#39;
  ),
  array (
    &#39;id&#39; => &#39;1&#39;,
    &#39;parent&#39; => &#39;3&#39;
  ),
  array (
    &#39;id&#39; => &#39;2&#39;,
    &#39;parent&#39; => &#39;3&#39;
  ),
  array (
    &#39;id&#39; => &#39;5&#39;,
    &#39;parent&#39; => &#39;1&#39;
  ),
  array (
    &#39;id&#39; => &#39;7&#39;,
    &#39;parent&#39; => &#39;1&#39;
  )
);
function html5_comment($comment) {
  echo &#39;<li>&#39;;
  echo &#39;id:&#39;, $comment[&#39;id&#39;], &#39; parent:&#39;, $comment[&#39;parent&#39;];
}
function start_el(& $output, $comment) {
  ob_start();
  html5_comment($comment);
  $output .= ob_get_clean();
}
function end_el(& $output) {
  $output .= "</li><!-- #comment-## -->\n";
}
function start_lvl(& $output) {
  $output .= &#39;<ol class="children">&#39; . "\n";
}
function end_lvl(& $output) {
  $output .= "</ol><!-- .children -->\n";
}
function display_element($e, & $children_elements, $max_depth, $depth, & $output) {
  $id = $e[&#39;id&#39;];
  start_el($output, $e); //当前评论的开始代码
  if ($max_depth > $depth +1 && isset ($children_elements[$id])) { //如果没超过最大层,并且存在子元素数组
    foreach ($children_elements[$id] as $child) {
      if (!isset ($newlevel)) { //第一次循环没设置变量$newlevel,所以把$newlevel设为true,并且开始子元素的开始代码;第二次及之后的循环,已经设置了$newlevel,就不会再添加子元素的开始代码。因为同一批循环时兄弟元素,所以只需要一个子元素开始代码,循环内容为并列关系。
        $newlevel = true;
        start_lvl($output);
      }
      display_element_template($child, $children_elements, $max_depth, $depth +1, $output); //$child作为参数,继续去寻找下级元素
    }
    unset ($children_elements[$id]); //用完释放变量,以后就不会重复判断该值了,递归后继续判断剩下的子元素
  }
  if (isset ($newlevel) && $newlevel) { //如果前面找到了子元素,这里就要执行子元素的结束代码
    end_lvl($output);
  }
  end_el($output); //当前评论的结束代码
}
function display_element_template($e, & $children_elements, $max_depth, $depth, & $output) {
  $id = $e[&#39;id&#39;];
  display_element($e, $children_elements, $max_depth, $depth, $output);
  if ($max_depth <= $depth +1 && isset ($children_elements[$id])) { //如果超出最大层级,并且子元素存在的话,以$child为参数继续往下找
    foreach ($children_elements[$id] as $child) {
      display_element_template($child, $children_elements, $max_depth, $depth, $output);
    }
    unset ($children_elements[$id]); //用完释放变量
  }
}
function comments_list($comments) {
  $top_level_elements = array ();
  $children_elements = array ();
  foreach ($comments as $e) {
    if (0 == $e[&#39;parent&#39;]) {
      $top_level_elements[] = $e;
    } else {
      $children_elements[$e[&#39;parent&#39;]][] = $e;
    }
  }
  $output = &#39;&#39;;
  foreach ($top_level_elements as $e) {
    display_element_template($e, $children_elements, 2, 0, $output);
  }
  //var_dump($children_elements);//由于每次用完$children_elements后都会释放变量,所以到最后$children_elements为空数组
  return $output;
}
echo &#39;<ol class="comment-list">&#39;, comments_list($comments), &#39;</ol>&#39;;

Ich glaube, Sie haben es gemeistert Nachdem Sie den Fall in diesem Artikel „Methode“ gelesen haben, lesen Sie bitte andere verwandte Artikel auf der chinesischen PHP-Website, um weitere spannende Informationen zu erhalten!

Empfohlene Lektüre:

Detaillierte Erläuterung des Beispiels für die Übermittlung von PHP-Curl mit CSRF-Token-Überprüfungssimulation

PHP-Implementierung der Datenbank Hinzufügungs- und Löschabfrage Detaillierte Erläuterung der Änderungsschritte

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Schritte zur Implementierung einer unbegrenzten Kommentarverschachtelung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn