【问题标题】:Putting multiple table values into array将多个表值放入数组
【发布时间】:2012-03-09 22:45:06
【问题描述】:

所以我试图遍历表的所有值,这些值通过 id 连接。涉及 4 个表,我试图根据第一个表的 id 从每个表中获取所有值。这是我到目前为止的代码。 (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
                                        );                  
                }
            }
        }
    }

我已经摆弄了一段时间,所以可能有些台词没有以最好的方式完成:)

所以基本上我需要稍后遍历数组,但我只是不确定实际填充它的最佳方法。

感谢您的帮助!

【问题讨论】:

    标签: php database arrays codeigniter foreach


    【解决方案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>';
    
      }
    ?>
    

    【讨论】:

    • 太棒了!这很有帮助,向我展示了一种更好的做事方式。遍历这个数组的最佳方法是什么?
    • 很高兴你喜欢它。您可以使用嵌套循环以类似于构建结果的方式迭代结果数据。
    • 我最近对我的回答的担忧是,您可能只想在自己的演示文稿中呈现不同的数据实体(表格)(例如将徽章与主题分开列出)。如果是这样的话,那么像你一样为每个数组构建单独的数组实际上会更有意义,但是当我看到你在每个数组中都包含父 ID 时,我认为你有兴趣保留这些关系,所以我决定构建数组来处理它。我正在做一个小小的编辑来记录这一点。
    • 很抱歉,但由于我只了解您所做的大部分工作,因此我不确定如何正确迭代数组。最好的方法是什么?
    • 好的,我添加了一些代码来展示如何迭代数组。
    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多