【问题标题】:PHP Loop within a loop循环内的 PHP 循环
【发布时间】:2012-02-03 21:25:54
【问题描述】:

在我的数据库中,我有一个“周”表和一个“锻炼”表。我想实现以下目标:

  • 第 1 周
    • 锻炼 1 标题
    • 锻炼 1 内容
    • 锻炼 2 标题
    • 锻炼 2 内容
    • 锻炼3……
  • 第 2 周
    • 锻炼 1 标题
    • 锻炼 1 内容
    • 锻炼 2 标题
    • 锻炼 2 内容
    • 锻炼3……
  • 第 3 周.....

我正在尝试类似的东西:

function get_weekly_content() {

        $user_id = $this->session->userdata('id');

        $weeks = $this->db->select('week_no')->where('user_id', $user_id)->get('weeks');

        if($weeks->num_rows > 0) {
            foreach($weeks->result() as $row) {
                $week_no = $row->week_no;

                $workouts = $this->db->where('user_id', $user_id)->where('week_no', $week_no)->get('workouts');

                if($workouts->num_rows > 0) {
                    foreach($workouts as $workout) {
                        $workout_data[] = $workout;
                    }
                }


                $weekly_data[] = $workout_data;

            }
            return $weekly_data;
        }
    }

但也许我有错误的想法。然后我还需要显示数据。

编辑我的问题是,实现上述目标并在视图页面上循环获取数组/对象的最佳方法是什么?

谢谢

【问题讨论】:

  • 你初始化了吗$workout_data

标签: php sql oop codeigniter activerecord


【解决方案1】:

在循环中循环就好了,你的方法是合适的。 但是!

  1. 一般来说,如果有任何方法可以避免,则不应在循环内运行 mysql 查询,因为查询速度非常慢,这会降低脚本的性能。否则,这个想法是正确的。尝试在循环之外编写一个查询,将所有相关的用户数据放入一个键控数组中,然后在循环时从数组中提取信息。

  2. 1234563它是随后的循环,然后在没有结果的任何一周,它将显示前一周的数据。您可以通过在内部循环顶部设置/重置 $workout_data 来解决此问题:

$workout_data = array(); 
if($workouts->num_rows > 0) {
   foreach($workouts as $workout) {
      $workout_data[] = $workout;
   }
}

【讨论】:

    【解决方案2】:
    function get_weekly_content() {
    
            $user_id = $this->session->userdata('id');
    
            $weeks = $this->db->select('week_no')->where('user_id', $user_id)->get('weeks');
            $weekly_data = array();
            if($weeks->num_rows > 0) {
                foreach($weeks->result() as $row) {
                    $workout_data = array();
                    $week_no = $row->week_no;
    
                    $workouts = $this->db->where('user_id', $user_id)->where('week_no', $week_no)->get('workouts');
    
                    if($workouts->num_rows > 0) {
                        foreach($workouts as $workout) {
                            $workout_data[] = $workout;
                        }
                    }
    
    
                    $weekly_data[$week_no] = $workout_data;
                }
            }
            return $weekly_data;
        }
    

    然后访问数据:

    $weekly_data = get_weekly_content();
    
    foreach( $weekly_data as $week_no => $workout_data){
      // do something with it.
    }
    

    话虽如此,我同意@Ben D,您应该考虑一下您的查询并创建一个可以一次返回所有结果的查询。

    【讨论】:

    • 你怎么能这样做呢?我同意一个查询是理想的
    猜你喜欢
    • 2016-09-26
    • 2012-07-19
    • 1970-01-01
    • 2017-05-28
    • 2012-12-22
    • 2014-06-18
    • 1970-01-01
    相关资源
    最近更新 更多