Объедините несколько наборов результатов CodeIgniter в один массив

#php #codeigniter #foreach #resultset

Вопрос:

Данные, запрошенные из базы данных.

 year 2021 = [
    {
        "month": 1,
        "total": "1,482"
    },
    {
        "month": 2,
        "total": "5,422"
    },
]
 

и

 year 2020 = [
    {
        "month": 1,
        "total": "2,482"
    },
    {
        "month": 2,
        "total": "6,422"
    },
    {
        "month": 3,
        "total": "7,422"
    },
    .........
    {
        "month": 12,
        "total": "20,422"
    },
]
 

Здесь я создаю метод под названием `getData(), я создаю цикл из 1-12, основанный на месяцах в году. Затем я хочу объединить данные в массив, но как мне объединить данные?

Ниже приведена моя модель контроллера, которая снова и снова вызывает один и тот же метод модели с различными параметрами:

 public function GetData(){
    $thn_now = 2021; 
    $thn_before = 2020; 
    $bulan = array();
    for ($bul = 1; $bul <= 12; $bul  ) {
        $sql = $this->My_model->model_month($bul,$thn_now)->result();  // Here I make the current year parameter
        // $sql2 = $this->My_model->model_month($bul,$thn_before)->result();  //here are the parameters of the previous year
        foreach($sql as $row) {
            $bulan[] = array(
                'bulan' => $bul,
                'total_now' => $row->hasil,
                // how to display the previous year's total in an array ?
                // 'total_before' => $row->hasil,
            );
        }
    }
    $this->set_response($bulan,200);  
}
 

Я хочу получить такой результат:

 [
    {
        "month": 1,
        "total_now": "1,482"
        "total_before": "2,482"
    },
    {
        "month": 2,
        "total_now": "5,522"
        "total_before": "6,422"
    },
    {
        "month": 3,
        "total_now": null 
        "total_before": "7,422"
    },
    .........
    {
        "month": 12,
        "total_now": null,
        "total_before": "20,422"
    },
]
 

В 2021 году общая сумма составляет только до 02 месяца, в то время как в 2020 году общая сумма составляет до 12 месяца.

Если 2021 год длится только до 02 месяца, то следующий массив будет полным null .

Комментарии:

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

2. вчера в моем коде была ошибка, извините

3. можете ли вы помочь мне со вчерашним ответом?

4. Я здесь вызываю ту же модель, только параметр year отличается $sql = $this->My_model->>model_month($bul,$yr_now)->>>результат(); у которых один и тот же ключ, т. е. общее ->>>> значение проверьте мой массив выше ?

5. какую базу данных вы используете

Ответ №1:

  1. Я не рекомендую вам совершать 24 поездки в базу данных для сбора индивидуальных итогов; Я настоятельно рекомендую вам создать новый метод модели, который обеспечивает все ежемесячные итоги за одну поездку.
  2. Я не рекомендую позволять вашему контроллеру диктовать тип результирующего набора, создаваемого на основе активной записи в модели. Модель должна последовательно возвращать одни и те же данные в одной и той же структуре во всем приложении.
  3. Мне кажется, что ваш внутренний цикл все равно собирает только одну строку, поэтому вместо result() того, чтобы создавать массив объектов, просто вызовите row() , который создает null или объект, а затем немедленно получите доступ к hasil свойству. Используя оператор объединения null, вы можете вернуться к null тому, когда hasil не является свойством не-объекта null .
  4. Профессиональные программисты по всему миру (в том числе те, которые не используют английский в качестве родного языка) рекомендуют писать переменные с использованием английских слов. Это позволяет более согласованному языку для других разработчиков просматривать и поддерживать ваш код. В конце концов, вы используете английский язык в остальной части вашего синтаксиса php, просто держите все это на английском языке.
  5. Для будущей гибкости разрешите передавать «текущий год» в качестве аргумента метода контроллера. Это позволит вам легко просматривать исторические данные (если в этом когда-либо возникнет необходимость). Если аргумент не передан, то по умолчанию используется текущий год.
  6. Жесткое кодирование числа каждого месяца приемлемо, потому что оно никогда не изменится. Однако, как правило, старайтесь избегать использования жестко закодированных чисел/значений в своем сценарии, чтобы он был более гибким, простым в обслуживании и интуитивно понятным для чтения.

Предлагаемый код (допускающий передачу до 24 активных объектов записи обратно контроллеру):

 public function GetMonthlyTotalsSincePreviousYear($year = null): void
{
    $thisYear = $year ?? date('Y');
    $lastYear = $thisYear - 1;
    $result = [];
    for ($month = 1; $month <= 12;   $month) {
        $result[] = [
            'month' => $month,
            'total_now' => $this->My_model->model_month($month, $thisYear)->row()->hasil ?? null,
            'total_before' => $this->My_model->model_month($month, $lastYear)->row()->hasil ?? null,
        ];
    }
     $this->set_response($result, 200);  
}
 

В моем собственном приложении у меня был бы метод модели, который собирает все данные, и контроллер, подобный этому:

 public function getMonthlyTotalsSincePreviousYear(int $year = null): void
{
    $this->set_response(
        $this->My_model->getMonthlyTotalsSincePreviousYear($year ?? date('Y')),
        200
    );
}
 

Ответ №2:

Это, я полагаю, поможет вам в разработке решения. Я не включил весь массив $year_2020, но надеюсь, вы поняли идею —

 $year_2021 = [
   [
    "month" => 1,
    "total_now" => "1,482"
   ],
   [
    "month" => 2,
    "total_now" => "5,422"
   ]
  ];

  $year_2020 = [
   [
    "month" => 1,
    "total_before" => "2,482"
   ],
   [
    "month" => 2,
    "total_before" => "6,422"
   ],
   [
    "month" => 3,
    "total_before" => "7,422"
   ]
  ];

  $output = [];

  foreach ($year_2021 as $obj) {
     $key = $obj['month'];
     $output[$key] = $obj;
  }

 foreach ($year_2020 as $obj) {
    $key = $obj['month'];
    if (isset($output[$key])) {
      $output[$key]['total_before'] = $obj['total_before'];
    } else {
      $obj['total_now'] = null;
      $output[$key] = $obj;
    }
   }

    $output = array_values($output);
    error_log(json_encode($output));
 

Выход

 [{"month":1,"total_now":"1,482","total_before":"2,482"},{"month":2,"total_now":"5,422","total_before":"6,422"},{"month":3,"total_before":"7,422","total_now":null}]
 

Комментарии:

1. Я здесь вызываю ту же модель, только параметр year отличается $sql = $this->My_model->>model_month($bul,$yr_now)->>>результат(); у которых один и тот же ключ, т. е. общее ->>>> значение проверьте мой массив выше ?

2. Я понял, что ваши данные имеют аналогичную структуру в базе данных, у обоих есть total в виде столбца, который позже вы обновите как total_before и total_now соответственно. Но я не понял вашего нынешнего вопроса.