Explication détaillée des étapes pour implémenter l'imbrication illimitée de commentaires en PHP

php中世界最好的语言
Libérer: 2023-03-26 06:44:01
original
2434 Les gens l'ont consulté

Cette fois, je vais vous apporter une explication détaillée des étapes pour implémenter l'imbrication illimitée des commentaires en PHP. Quelles sont les précautions pour implémenter l'imbrication illimitée des commentaires en PHP Voici un cas pratique, prenons un. regarder.

Dans le processus de conception de BB, j'ai réfléchi à la possibilité d'obtenir un affichage infini de la structure de classification et une recherche de structure parent-enfant sans récursion, car si l'algorithme ici n'est pas optimisé, les conséquences peuvent être fatal! Imaginez, si un article contient 300 commentaires, selon l'algorithme récursif normal, la base de données doit être interrogée au moins 301 fois, et ce sans aucune imbrication s'il y a un ou deux niveaux d'imbrication ou si le nombre de commentaires dépasse 1 000. , alors la base de données ne plante pas directement ?
En fait, les puissantes capacités de traitement de tableaux de PHP peuvent déjà nous aider à résoudre ce problème rapidement et facilement. L'image ci-dessous montre une structure de base de données

classifiée à niveaux infinis :

IDparentID newsID commts
108 commentaires avec l'ID d'article 8
21 8 réponses aux commentaires avec l'ID 1
328 réponses au commentaire avec l'ID 2

Pour afficher le commentaire avec le numéro d'article 8 dans le frontend de manière imbriquée, en fait, il suffit d'interroger la base de données une seule fois, c'est-à-dire "SELECT * FROM TABLE WHERE newsID=8" , et laissez le travail récursif ultérieur au puissant tableau PHP. Le problème qui peut être impliqué ici est la réorganisation de la relation structurelle du tableau, c'est-à-dire le fait de placer tous les commentaires qui restent dans la catégorie de premier niveau sous leur propre ID parent pour former l'élément enfants.
Je vais coller ce code dans la classe BBCComment ci-dessous. J'espère partager mes idées avec vous et j'espère que tout le monde pourra proposer des algorithmes meilleurs et plus efficaces.

Première méthode

/** 
 * 按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); 
 /* 重组结束 */
Copier après la connexion

Méthode de mise en œuvre deux

Le code principal est extrait de 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;;
Copier après la connexion

Je crois vous avez lu le cas dans cet article. Vous maîtrisez la méthode. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

Explication détaillée de php curl avec exemple de soumission de simulation de vérification de jeton csrf

implémentation php de la base de données requête d'ajout et de suppression Explication détaillée des étapes de modification

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!