PHP在数组上的深度循环就像线程注释一样

时间:2010-11-05 14:15:15

标签: php arrays multidimensional-array

我正在尝试为我正在处理的工作创建一个基于“深度”的线程评论类型的东西。代码(如下)有效,但很难。麻烦,我也想去$ x深度,我做的方式将意味着“很多”循环,任何关于如何创建一个更简单/更好的方法的建议?

    $sql = $azdb->get_row("SELECT * FROM ".$table_prefix."_content WHERE ID='".$_GET['ID']."'");

if($sql): 

echo  '<h2>'.$sql->content_title.'</h2>';

echo  date('d m Y',strtotime($sql->content_modified));

echo  '<br />';

echo  $sql->content;

endif;



$sql = $azdb->get_results("SELECT * FROM ".$table_prefix."_content WHERE content_parent='".$_GET['ID']."'");

if($sql): foreach($sql as $sql):

echo  '<div class="comments">';

echo  '<h2>Main '.$sql->content_title.'</h2>';

echo  date('d m Y',strtotime($sql->content_modified));

echo  '<br />';

echo  $sql->content;

echo  '<br />';




$sql1 = $azdb->get_results("SELECT * FROM ".$table_prefix."_content WHERE content_parent='".$sql->ID."'");

if($sql1): foreach($sql1 as $sql1):

echo  '<div class="comments">';

echo  '<h2>'.$sql1->ID.' - '.$sql1->content_title.'</h2>';

echo  date('d m Y',strtotime($sql1->content_modified));

echo  '<br />';

echo  $sql1->content;

$sql2 = $azdb->get_results("SELECT * FROM ".$table_prefix."_content WHERE content_parent='".$sql1->ID."' ");

if($sql2): foreach($sql2 as $sql2):

echo  '<div class="comments">';

echo  '<h2>'.$sql2->content_title.'</h2>';

echo  date('d m Y',strtotime($sql2->content_modified));

echo  '<br />';

echo  $sql2->content;

echo  '</div>';

endforeach; endif;

echo  '</div>';

endforeach; endif;

echo  '</div>';

endforeach; endif;

帮助表示赞赏。感谢

2 个答案:

答案 0 :(得分:0)

使用像这样的递归函数

$id = isset($_GET['id']) ? $_GET['id'] : 0;
$root_sql = $azdb->get_results("SELECT * FROM categories WHERE cat_parent = " . $id);

recursive_categories($root_sql);

function recursive_categories($results)
{
     if(count($results))
     {
         echo "<ul>";
         foreach($results as $res)
         {
             echo "<li>" . $res->category;
             //Rest of what ever you want to do with each row

             //Check this category for children
             $rows = $azdb->get_results("SELECT * FROM categories WHERE cat_parent  = " . $res->id);

             recursive_categories($rows);

             //has to be after the inner loops
             echo "</li>";
         }
         echo "</ul>";
     }
}

因此,对于root的每次迭代,它会找到另一个属于id的父类的类,然后在该点运行相同的函数,从而创建另一个内部循环。

相应地修改,但你明白了。

答案 1 :(得分:0)

在这种情况下我要做的是首先回顾您如何将注释插入数据库。您定义的模式是整个模块中最重要的组成部分。

我在这里引用了类似的问题: Fast Relational method of storing tree data (for instance threaded comments on articles)

用户对如何存储此注释数据感到难过,而Drupal格式确实非常有效。通过这种方式查看,您可以创建一个干净的方法,这将消除您的多个x SQL查询。

只需创建您的评论ID(字符串):

1 - main
1.1 - comment 1
1.2 - comment 2
1.2.1 - nested comment for comment 2
1.2.1.1 - nested comment for comment 2, nested comment 1
1.2.2
1.2.3
1.2.2.1
1.1.1 - (this comment you could order by your sql call to be 3rd from the top, etc)

这允许您进行一次SELECT * FORM调用(获取所有x.%等ID),然后正确地排序所有注释,并能够将ID用作条件检查窝或不。

我认为您需要首先重新考虑您的架构,然后处理PHP代码,它只是一堆<li>条目。

@RobertPitt的答案是'ok'但它对你没有任何帮助,因为它只是将你的代码从顺序条件清理到正确的递归函数。