【问题标题】:Merge multiple CodeIgniter result sets into one array将多个 CodeIgniter 结果集合并到一个数组中
【发布时间】:2021-08-05 04:02:14
【问题描述】:

从数据库中查询到的数据。

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

【问题讨论】:

  • 为什么要发布相同的问题,而您已经问过了,却在人们回复时将其删除?如果您需要更多说明或想添加更多信息,请在原始帖子中进行,而不是创建新帖子。
  • 昨天我的代码出错了,抱歉
  • 你能帮我解答昨天的问题吗?
  • 我这里调用的是同一个模型,只是年份参数不同 $sql = $this->My_model->model_month($bul,$yr_now)->result();哪些具有相同的键,即总 -> 值检查我上面的数组?
  • 你用的是什么数据库

标签: php codeigniter foreach resultset


【解决方案1】:
  1. 我不建议您访问数据库 24 次来收集个人总数;我会敦促您创建一种新的模型方法,该方法可在一次旅行中提供所有月度总计。
  2. 我不建议让您的控制器指定从模型中的活动记录创建的结果集的类型。该模型应该在整个应用程序中始终以相同的结构返回相同的数据。
  3. 在我看来,您的内部循环无论如何都只收集一行,所以不是创建对象数组的result(),而是调用创建nullrow() 或一个对象,然后立即访问@987654324 @ 财产。使用空合并运算符,当hasil 不是非对象null 的属性时,您可以回退到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}]
    

    【讨论】:

    • 我这里调用的是同一个模型,只是年份参数不同 $sql = $this->My_model->model_month($bul,$yr_now)->result();哪些具有相同的键,即总 -> 值检查我上面的数组?
    • 我知道您的数据在数据库中具有相似的结构,两者都有总计作为列,稍后您将分别更新为 total_before 和 total_now。但我不明白你当前的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 2019-07-01
    • 2016-04-25
    • 2014-01-25
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多