#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:
- Я не рекомендую вам совершать 24 поездки в базу данных для сбора индивидуальных итогов; Я настоятельно рекомендую вам создать новый метод модели, который обеспечивает все ежемесячные итоги за одну поездку.
- Я не рекомендую позволять вашему контроллеру диктовать тип результирующего набора, создаваемого на основе активной записи в модели. Модель должна последовательно возвращать одни и те же данные в одной и той же структуре во всем приложении.
- Мне кажется, что ваш внутренний цикл все равно собирает только одну строку, поэтому вместо
result()
того, чтобы создавать массив объектов, просто вызовитеrow()
, который создаетnull
или объект, а затем немедленно получите доступ кhasil
свойству. Используя оператор объединения null, вы можете вернуться кnull
тому, когдаhasil
не является свойством не-объектаnull
. - Профессиональные программисты по всему миру (в том числе те, которые не используют английский в качестве родного языка) рекомендуют писать переменные с использованием английских слов. Это позволяет более согласованному языку для других разработчиков просматривать и поддерживать ваш код. В конце концов, вы используете английский язык в остальной части вашего синтаксиса php, просто держите все это на английском языке.
- Для будущей гибкости разрешите передавать «текущий год» в качестве аргумента метода контроллера. Это позволит вам легко просматривать исторические данные (если в этом когда-либо возникнет необходимость). Если аргумент не передан, то по умолчанию используется текущий год.
- Жесткое кодирование числа каждого месяца приемлемо, потому что оно никогда не изменится. Однако, как правило, старайтесь избегать использования жестко закодированных чисел/значений в своем сценарии, чтобы он был более гибким, простым в обслуживании и интуитивно понятным для чтения.
Предлагаемый код (допускающий передачу до 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 соответственно. Но я не понял вашего нынешнего вопроса.