【问题标题】:Return a 4-dimension array with SQL and Codeigniter使用 SQL 和 Codeigniter 返回一个 4 维数组
【发布时间】:2015-09-26 15:13:39
【问题描述】:

我需要进行查询并获取某种数据。我有 2 个表、用户和连接,我需要获取每个用户每月和每年连接的次数。

users             connections
...........    ................
john              10/02/2014
john              15/02/2014
john              03/01/2015
john              06/02/2015

是否有机会以这种格式获取此信息:

 john=>
   [0]=>2014
     [0]=>02
       'total' =>2
   [1]=>2015
     [0]=>01
       'total' => 1
     [1]=>02
       'total' => 2
     [2]=>03
       'total'=> 1 

我正在使用 Codeigniter 和 PHP。

回答@CodeGodie 到目前为止我所做的是:

public function getPeriodicity(){
    $this->db->select('u.vusr_user, extract (MONTH from (to_timestamp(c.vuc_log_in))) as month, extract (YEAR from (to_timestamp(c.vuc_log_in))) as yearly, COUNT(c.vuc_log_in)');
    $this->db->from('vts_users_conn c');
    $this->db->join('vts_users u', 'c.vuc_vusr_id = u.vusr_id');
    $this->db->group_by('u.vusr_user, month, yearly','asc');
    $query = $this->db->get();
    return $query->result_array();
  }

【问题讨论】:

标签: php mysql arrays codeigniter multidimensional-array


【解决方案1】:

假设您使用 Codeigniter 的 $this->db->result_array() 获取数据库结果,您的初始数组将如下所示:

$res = array(
    array(
        "name" => "john",
        "date" => "10/02/2014"
    ),
    array(
        "name" => "john",
        "date" => "15/02/2014"
    ),
    array(
        "name" => "john",
        "date" => "03/01/2015"
    ),
    array(
        "name" => "john",
        "date" => "06/02/2015"
    ),
    array(
        "name" => "john",
        "date" => "06/03/2015"
    )
);

为了将此数组更改为您想要的输出,我将执行以下操作:

foreach ($res as $row) {
    $date_arr = explode("/", $row['date']);
    $n = $row['name'];
    $y = $date_arr[2];
    $m = $date_arr[1];

    if (!isset($final[$n]))
        $final[$n] = array();

    if (!isset($final[$n][$y]))
        $final[$n][$y] = array();

    if (!isset($final[$n][$y][$m])) {
        $final[$n][$y][$m] = array("total" => 1);
    } else {
        $final[$n][$y][$m]["total"] = $final[$n][$y][$m]["total"] + 1;
    }
}

如果你var_dump你的最终结果(var_dump($final)),你会得到以下结果:

array (size=1)
  'john' => 
    array (size=2)
      2014 => 
        array (size=1)
          '02' => 
            array (size=1)
              'total' => int 2
      2015 => 
        array (size=3)
          '01' => 
            array (size=1)
              'total' => int 1
          '02' => 
            array (size=1)
              'total' => int 1
          '03' => 
            array (size=1)
              'total' => int 1

希望这会有所帮助。

【讨论】:

  • 您提出解决方案的方式对我帮助很大。我可以让你的想法适应我​​的算法。
  • 太棒了。我很高兴能够帮助您朝着正确的方向前进。
【解决方案2】:

作为一般规则,如果您可以访问数据并在脑海中看到您希望该数据看起来如何,那么就很有可能让它做到这一点。这只是制定流程的问题。

在你的情况下,我会执行以下步骤:

  • 按用户排序数据,然后按日期排序,这样一切都很好
  • 遍历数据,每次检查当前用户是否与上一个用户相同。如果不是,则创建一个新的数组键
  • 将日期分成你想要的部分
  • 检查用户数组中与该用户年份相关的键。如果存在年份,则搜索月份。如果该月存在,则将该月的总数加 1。如果年和/或月不存在,则创建键并将该月的总数设置为 1

处理完记录后,您应该拥有所需格式的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2020-07-08
    相关资源
    最近更新 更多