Помещение нескольких значений таблицы в массив - PullRequest
1 голос
/ 10 марта 2012

Поэтому я пытаюсь перебрать все значения таблиц, которые соединяются по идентификаторам. В нем участвуют 4 таблицы, и я пытаюсь получить все значения из каждой в соответствии с идентификатором первой таблицы. Вот код, который у меня есть. (P.S. Я использую метод базы данных 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
                                        );                  
                }
            }
        }
    }

Некоторое время я возился, поэтому могут быть строки, которые сделаны не лучшим образом :) 1004 *

Так что, в основном, мне нужно перебрать массив позже, но я просто не уверен, что для начала лучше всего заполнить его.

Спасибо за помощь !!

1 Ответ

1 голос
/ 10 марта 2012

Мне кажется, что ваш код выполняет какую-то замену, которую вы, вероятно, не хотите.По крайней мере, со строками:

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

Если вы заинтересованы в использовании (представлении) данных, разделенных сущностью (таблицей), то единственное изменение, которое я советую вам сделать, это изменить эти две строки (выше) наследующее:

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

НО, я заметил, что вы включаете родительский идентификатор в каждую из дочерних сущностей, что приводит меня к выводу, что вы хотите использовать / представить данные таким образом, чтобы отразить реляционныеиерархия.Если это так, я рекомендую вам сделать что-то вроде:

$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>';

  }
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...