2012-03-09 107 views
1

所以我試圖循環所有通過id連接的表的值。有4個表參與,我試圖根據第一個表的ID從每個表中獲取所有值。這是我迄今爲止的代碼。 (PS我使用CodeIgniter的數據庫的方法)將多個表值放入數組

$course = $this->db->query("SELECT * FROM courses"); 

    // Put Courses into array 
    foreach ($course->result() as $row) 
    { 
     $courses['id'] = $row->id; 
     $courses['course_name'] = $row->course_name; 

     // Put Topics into array 
     $topic = $this->db->query("SELECT * FROM course_topics WHERE course_id = 5"); 
     foreach ($topic->result() as $row) 
     { 
      $topics[] = array(
           'id'   => $row->id, 
           'course_id'  => $row->course_id, 
           'topic_name' => $row->topic_name, 
           'order'   => $row->order 
           ); 

      // Put badges into array 
      $badge = $this->db->query("SELECT * FROM course_topic_badges WHERE topic_id = ".$row->id); 
      foreach ($badge->result() as $row) 
      { 
       $badges[] = array(
            'id'   => $row->id, 
            'topic_id'  => $row->topic_id, 
            'badge_name' => $row->badge_name 
            ); 

       // Put dotpoints into array 
       $dotpoint = $this->db->query("SELECT * FROM course_topic_dotpoints WHERE badge_id = ".$row->id); 
       foreach ($dotpoint->result() as $row) 
       { 
        $dotpoints[] = array(
             'id'   => $row->id, 
             'badge_id'  => $row->badge_id, 
             'dotpoint'  => $row->dotpoint, 
             'viddler_video_id' => $row->viddler_video_id, 
             'viddler_openurl' => $row->viddler_openurl, 
             'order'   => $row->order 
             );     
       } 
      } 
     } 
    } 

我一直在擺弄周圍了一段時間,所以有可能是未在最佳時尚:)

這樣做基本的某些行我以後需要遍歷數組,但我只是不確定實際填充它的最佳方法。

感謝您的幫助!

回答

1

在我看來,你的代碼正在做一些替換,你可能不希望它。至少與線:

$courses['id'] = $row->id; 
$courses['course_name'] = $row->course_name; 

如果您有興趣使用(呈現)的實體(表)分開的數據,那麼我勸你做出的唯一改變是改變那些兩條線(上圖)以下:

$courses[] = array('id'=>$row->id, 'course_name'=>$row->course_name); 

,但我注意到,您包括每個兒童實體的父ID這使我得出結論,要使用/的方式來呈現這些數據以反映關係的層次結構。如果是這樣,我建議你做類似的情況:

$query = $this->db->query('SELECT * FROM courses'); 
$courses = $query->result_array(); 

// Put Courses into array 
foreach ($courses as &$c) 
{ 
    // Put Topics into array 
    $query = $this->db->query('SELECT id, topic_name, `order` FROM course_topics WHERE course_id = '.$c['id']); 
    $topics = $query->result_array(); 
    $c['topics'] = $topics; 
    foreach ($topics as $ti=>$t) 
    { 
    $query = $this->db->query('SELECT id, badge_name FROM course_topic_badges WHERE topic_id = '.$t['id']); 
    $badges = $query->result_array(); 
    $c['topics'][$ti]['badges'] = $badges; 
    foreach ($badges as $bi=>$b) 
    { 
     $query = $this->db->query('SELECT id, dotpoint, viddler_video_id, viddler_openurl, `order` FROM course_topic_dotpoints WHERE badge_id = '.$b['id']); 
     $dotpoints = $query->result_array(); 
     $c['topics'][$ti]['badges'][$bi]['dotpoints'] = $dotpoints; 
    } 
    } 
} 

這將構建一個相當大的關聯數組,但如果你真的需要所有的數據和關係的層次結構是非常重要的一個很好的數據結構給你。當然,最好將你建立的東西減少到你將要使用的東西。

編輯:

這是你會如何遍歷/解壓縮從陣列中的信息。該代碼將位於視圖文件中。

<h2>Courses:</h2> 
<?php 
    foreach($courses as $c) 
    { 
    echo '<h3>'.$c['course_name'].' ('.$c['id'].")</h3>\n"; 
    echo '<ul>'; 
    foreach($c['topics'] as $t) 
    { 
     echo '<li>'.$t['topic_name'].' ('.$t['id'].")</li>\n"; 
     echo '<ul>'; 
     foreach($t['badges'] as $b) 
     { 
     echo '<li>'.$b['badge_name'].' ('.$b['id'].")</li>\n"; 
     echo '<ul>'; 
     foreach($b['dotpoints'] as $dp) 
     { 
      echo '<li>'.$dp['dotpoint'].' viddler: '.$dp['viddler_video_id'].' viddler_url: '.$dp['viddler_openurl']."</li><br/>"; 
     } 
     echo '</ul>'; 
     }  
     echo '</ul>'; 
    } 
    echo '</ul>'; 

    } 
?> 
+0

令人驚歎!這非常有幫助,並且表明我有更好的做事方式。什麼是迭代這個數組的最好方法? – Sneaksta 2012-03-10 10:39:52

+0

很高興你喜歡它。您可以使用嵌套循環以類似於構建結果的方式迭代結果數據。 – ghbarratt 2012-03-10 15:06:43

+0

我最近對我的回答感到擔心的是,您可能只想在自己的演示文稿中呈現不同的數據實體(表格)(例如列出與主題分開的徽章)。如果是這樣的話,那麼它實際上會更有意義爲每個數組構建單獨的數組,但是當我看到您在每個數據庫中都包含父ID時,我認爲您有興趣保留這些關係,所以我決定構建數組來處理它。我正在做一個小小的編輯來記錄這一點。 – ghbarratt 2012-03-10 15:23:35