PHP unbegrenzte Kommentarverschachtelung Implementierungscode PHP-Kenntnisse

jacklove
Freigeben: 2023-04-01 20:26:01
Original
1871 Leute haben es durchsucht

In diesem Artikel geht es um die Einführung von Kommentarverschachtelungsbeispielen auf unendlicher Ebene in PHP. Während des Entwurfs von BB habe ich darüber nachgedacht, ob es möglich ist, eine Klassifizierungsstrukturanzeige auf unendlicher Ebene und eine Suche nach übergeordneten und untergeordneten Strukturen ohne Rekursion zu erreichen. Denn wenn dies hier nicht geschieht, kann die Optimierung des Algorithmus fatale Folgen haben.

Während des Entwurfs von BB habe ich darüber nachgedacht, ob es möglich ist, eine unendliche Anzeige der Klassifizierungsstruktur und eine Eltern-Kind-Struktur zu erreichen Suche ohne Rekursion, denn wenn dies nicht geschieht, kann die Algorithmusoptimierung fatale Folgen haben! 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 hier möglicherweise auftretende Problem besteht in der Neuorganisation der strukturellen Beziehung des Arrays, d. h. darin, alle Kommentare, die in der Kategorie der ersten Ebene verbleiben, unter ihrer eigenen parentID unterzubringen, 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); 
 /* 重组结束 */
Nach dem Login kopieren

Implementierungsmethode zwei

Der Kerncode stammt 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;;
Nach dem Login kopieren

Das war's für diesen Artikel. Wenn Sie sich auf einige Open-Source-CMS beziehen, können Sie hoffentlich auch viele gute Codes sehen Unterstützen Sie in Zukunft die chinesische PHP-Website.

Verwandte Empfehlungen:

PHP implementiert Funktionen zum Hinzufügen, Löschen und Ändern von Datenbanken sowie vollständige Code-PHP-Beispiele

PHPAILER implementiert PHP-Entwicklung E-Mail-Funktion PHP-Beispiel

PHP-App-Entwicklungsschnittstellenverschlüsselung, detaillierte Erklärung_php-Fähigkeiten


Das obige ist der detaillierte Inhalt vonPHP unbegrenzte Kommentarverschachtelung Implementierungscode PHP-Kenntnisse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage