PHP Loop внутри цикла - PullRequest
       0

PHP Loop внутри цикла

1 голос
/ 04 февраля 2012

В моей базе данных есть таблица "недель" и таблица "тренировок". Я хотел бы добиться чего-то вроде следующего:

  • Неделя 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;
        }
    }

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

РЕДАКТИРОВАТЬ, мой вопрос в том, что было бы наилучшим способом для достижения вышеупомянутого и получения и массива / объекта для циклического просмотра на странице просмотра?

Спасибо

Ответы [ 2 ]

4 голосов
/ 04 февраля 2012

Цикл с циклом - это нормально, и ваш подход оправдан. Однако!

  1. Вообще говоря, вы не должны запускать запросы mysql внутри циклов, если есть какой-либо способ избежать этого, потому что запросы довольно медленные, это действительно ухудшитвыполнение вашего сценария.В противном случае идея верна.Попробуйте написать запрос вне циклов, который помещает все соответствующие пользовательские данные в массив с ключами, а затем извлекает информацию из массива во время цикла.

  2. Вы собираетесьчтобы увидеть проблемы с этой строкой: $weekly_data[] = $workout_data; если $workouts->num_rows > 0 ... если это первый цикл, он выдаст ошибку, потому что $workout_data не будет установлен, и если это последующие циклы, то на любой неделе, которая не 'Результаты не отображаются, будут отображаться данные за предыдущую неделю.Вы можете исправить это, установив / сброс $workout_data в верхней части внутреннего цикла:


$workout_data = array(); 
if($workouts->num_rows > 0) {
   foreach($workouts as $workout) {
      $workout_data[] = $workout;
   }
}
0 голосов
/ 04 февраля 2012
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, вам следует подумать о своем запросе и создать тот, который может возвращать все результаты сразу.

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