2013-03-22 79 views
5

我只使用控制器和視圖。
使用以下代碼我顯示帖子和帖子有回覆。
我用下面的控制器和查看來顯示帖子和回覆。如何將遞歸函數的結果傳遞到查看

通過使用查詢1我從帖子表中選擇帖子作爲主題ID(例如,主題ID = 34)並使用此獲得帖子ID 30和31。

通過使用查詢2我從回覆表中選擇每個帖子ID的回覆。
說具有響應ID 1和
交ID 31交ID 30通過使用第二for循環我正在選擇具有響應ID 2.

如果任何答覆使用PARENT_ID柱從回覆表具有哪吒答覆。(使用遞歸調用以showreply()函數)

我卡在我如何通過遞歸函數showreply()在視圖中的結果。

通過使用我的代碼DISPLY:

後30
---爲崗位30
後31
第一個回覆---爲崗位31

答覆,但我想告訴喜歡。

後30
---爲崗位30
第一個回覆---回覆到第一個回覆
發佈31
---爲崗位31
第一個回覆---回答第一個答覆

我已經使用遞歸函數調用來獲得答覆使用父母的ID回覆,但我沒有得到如何通過這個查看。

控制器:答覆表

<?php 
public function viewpost() 
    { 
     //Query 1 

     $topicid = trim($this->input->get('topicid')); 
     $q =$this->db->select(array(
      'fp.id as id', 
      'fp.postdata', 
      'fp.topicid')) 
      ->from('forum_post AS fp') 
      ->where('fp.topicid',$topicid) 
      ->order_by('fp.id DESC')->limit(0,10)->get(); 

     $resultq1 = $q->result_array(); 
     $data['resultq1'] = $resultq1; 

     //$data['resultq1'] = $res; 
     $resultq2 = array(); 
     foreach ($resultq1 as $rec) 
     { 
      //Query 2 

      $postid = $rec['id']; 
      $q1 =$this->db->select(array(
       'fr.id as id', 
       'fr.reply_data')) 
       ->from('forum_reply AS fr') 
       ->where('fr.postid',$postid) 
       ->order_by('fr.id ')->get(); 

      $resultq2[$postid] = $q1->result_array(); 
      $data["resultq2"][$postid] = $resultq2[$postid]; 

      foreach($q1->result_array() as $row1) 
      { 

       //second for loop 

        $reply_id = $row1['id']; 
        $resultq3[$reply_id] = $this->showreply($reply_id); // call to function 
        $data["resultq3"] = $resultq3[$reply_id]; 


      }//inner for loop 
     } //outer for loop 

     $this->load->view('viewpost',$data); 
    } 

    public function showreply($reply_id) 
    { 

        $reply_id1 = $reply_id; 
        $q1 =$this->db->select(array(
         'fr.id as id', 
         'fr.reply_data', 
         'fr.parent_id')) 
         ->from('forum_reply AS fr') 
         ->where('fr.parent_id',$reply_id1) 
         ->order_by('fr.id ')->get(); 

         //print $this->db->last_query(); 
         $resultq4[$reply_id1] = $q1->result_array(); 
         $data["resultq4"]= $resultq4[$reply_id1]; 

         $i=0; 
         foreach($q1->result_array() as $row4) 
         { 
           print_r($q1->result_array()); 
           echo "id".$id = $row4['id']; 
           $parent_id = $row4['parent_id']; 
           if($parent_id!=0) 
           { 
            //$data['nested'][$i] = $q1->result_array(); 
            $this->showreply($id); //recursive call to function       
            $i++; 
           } 
         } 

      return $resultq4; 
    } 
?> 

表結構:

Rep_id rep_text      post_id  Parent_ID 
------------------------------------------------------------------------- 
    1   Reply for post 30    30   null 
    2   Reply for post 31    31   null 
    3   reply to Rep_id 1    null   1 
    4   Rep_id 3 have Rep_id 4   null   3 
    5   Reply for post 31    null   2 
    6   Reply for Rep_id 5    null   5 

---------------------------------------------------------------------------- 

郵政表:

post_id topic id post_title post_desc 
----------------------------------------- 
    30  34   xyz   sssss 
    31  34   pqr   tyyyu 

---------------------------------------- 

* 查看: *

<div> 
    <?php foreach($resultq1 as $row) 
    { ?> 
     <ul> 
      <li></li>  // used to display post 
     </ul> 
    <?php foreach($resultq2 as $rows) 
    { 
     foreach($rows as $row1) 
     { 
      if($row['id']==$row1['postid']) 
      { ?> 
      <ul> 
       <li></li>  // used to display reyly for post 
      </ul> 
      <?php foreach($resultq3 as $rows) 
      { 
       foreach($rows as $row2) 
       { 
        if($row1['id']==$row2['parent_id']) 
       { ?> 
        <ul> 
         <li></li> // used to display reply for reply 
        </ul> 
       <?php  
       }//if 
       } //inner for $row2 
      } // outr for $resultq3 
      } //if 
     } //inner for of $row1 
     }//outer for $resultq2 
    } ?> 
    </div> 
+0

你能更清楚嗎? – 2013-03-23 04:44:50

+0

只會有4個回覆..? – 2013-03-23 05:00:12

+0

查看我的編輯問題 – Kango 2013-03-27 05:55:46

回答

2

我很抱歉,但是這是一個非常糟糕的代碼:(。我會建議重寫整個事情..

例如

表的帖子:

ID type title content parent_id post_id 
1 post  xyx  asd  Null  1 
2 comment asd  DEMO  1   1 
2 comment com  DEMO2  2   1 

現在這是我的建議,

所有職位應在1臺

與列類型(枚舉場[post,comment])

a parent_id列將指定它在樹中的位置。

和將所有這些粘合在一起的post_id表。

現在所有你需要做的就是

$post = $this->db->select('*')->where('post_id',$post_id)->get('posts'); 

現在$職位將包括其意見和subcomments,一切所有的帖子..

在一個單一的數據庫查詢

,所有你需要做的現在是時候組織他們在assoc命令陣列

$post = $this->db->select('*')->where('post_id',$post_id)->get('posts'); 

if($post->num_rows==0)return false;//end if there is no post found 

//step 1 find main post 
$main_post=FALSE; 
foreach($post as $fp){ 
if($fp->type=='post')$main_post=array ('id'=>$fp->id,'title'=>$fp->title,'content'=>$fp->content); 
} 

if($main_post==false)return false;///THERE WAS NO MAIN POST FOUND !!! 

//step 2 get comments on post 

$comments=array(); 

foreach($post as $fp){ 
if($fp->type=='comment' && $fp->parent_id==$main_post['id']){ 
$comment[$fp->id]=array('title'=>$fp->title,'content'=>$fp->content,'child'=>array()); 
} 
} 

//step 3 comments of a comment 

//IF comment is not on parent so its on another comment right :) ! 
foreach($post as $fp){ 
if($fp->type=='comment' && $fp->parent_id != $main_post['id']){ 
$comment[$fp->parent_id]['child'][]=array('title'=>$fp->title,'content'=>$fp->content); 
} 
} 

現在你有inisde $評論變種,很容易環路和主後$邁裏面所有評論您的意見和建議n_post :)簡單視圖將

<h2><?=$main_post['title']?></h2> 
<div class='fp_post'> 
<?=$main_post['post']?> 
</div> 
<ul class='comments'> 

<? 
foreach($comment as $c){ 
echo "<li> $c['title'] : $c['content']"; 

if(!empty($c['comment'])){ 
//there is a comments on this comment :) 
echo "<ul>"; 
foreach($c['comment'] as $coc){echo "<li> $coc['title']: $coc['content']</li>";} 
echo "</ul>";//end of comment of comments 
} 
echo "</li>"//end of a comment and its comments 

} 

?> 
</ul> 

我希望這個簡單的代碼爲您排憂解難解決您的問題,這是做的簡單而有效的方法,而且我確定你可以使用一些調試-ING try_catch代替錯誤返回錯誤,也可以添加一些驗證,但這不是我們現在的情況。

希望這個答案對你:)不夠好

cheerz

+0

顯示的代碼非常難看,但假設只允許2級註釋,這個想法本身就很好。 – ahmad 2013-03-31 22:18:52

+0

嗨,即時興趣,你究竟對代碼有什麼憎惡? – Zalaboza 2013-04-01 10:16:14

2

這就是我的回答:

首先

考慮使用MVC的形式給出,在模型中分離你的數據庫查詢部分應用程序。

你應該總是請檢查是否存在導致您的查詢或沒有。這可以防止您的代碼在您的查詢中沒有結果時發生致命錯誤,並嘗試對其進行foreach。:

<?php 
public function viewpost() 
{ 
    //Query 1 

    $topicid = trim($this->input->get('topicid')); 
    $q =$this->db->select(array(
      'fp.id as id', 
      'fp.postdata', 
      'fp.topicid')) 
      ->from('forum_post AS fp') 
      ->where('fp.topicid',$topicid) 
      ->order_by('fp.id DESC')->limit(0,10)->get(); 
    //$data['resultq1'] = $res; 
    $resultq2 = array(); 
    if($q->num_rows() > 0) 
    { 
      $resultq1 = $q->result_array(); 
      foreach ($resultq1 as $rec) 
      { 
       //Query 2 

       $postid = $rec['id']; 
       $q1 =$this->db->select(array(
        'fr.id as id', 
        'fr.reply_data')) 
        ->from('forum_reply AS fr') 
        ->where('fr.postid',$postid) 
        ->order_by('fr.id ')->get(); 

      // the rest of your code 

    } 

    // the rest of your code 

我以爲你會顯示你的相同第一級的答覆爲你的第二個層次的答覆(而不是嵌套):

- 回覆發帖

- reply to reply

- 回覆後

- 回覆回覆

<div> 
<?php 
if($resultq1) 
{ 
    echo '<ul>'; 
    foreach($resultq1 as $row) 
    { 
     echo '<li>';  
     echo $row;// used to display post 
     if(resultq2) 
     { 
     echo '<ul>'; 
     foreach($resultq2 as $rows) 
     { 
      echo '<li>'; 
      echo $rows; // display reply to post 
      echo '</li>'; 
      if($resultq3) 
      { 
       foreach($resultq3 as $row1) 
       { 
        echo '<li>'; 
        echo $row1; // display reply to reply 
        echo '</li>'; 
       } 
      } 
      } 
      echo '</ul>'; 
     } 
     echo '</li>'; 
    } 
    echo '</ul>'; 
    } 
    </div> 

到目前爲止,這是我的回答,我希望這幫助你。

+0

您指出的解決方案並不涵蓋所有可能性。在這種情況下,遞歸解決方案是最好的方法,因爲有N個級別的答覆。我試圖找出這樣的問題的解決方案。當我到達它時,我會在這裏發佈解決方案的鏈接。 – Elkas 2015-08-08 13:52:48